-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
2373f85
commit 4af20ee
Showing
11 changed files
with
298 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
from golem.core.optimisers.common_optimizer.node import Node | ||
from golem.core.optimisers.common_optimizer.task import TaskStatusEnum, TaskMixin | ||
from golem.core.optimisers.genetic.operators.mutation import Mutation as OldMutation | ||
|
||
|
||
class EvaluatorTask(TaskMixin): | ||
def __init__(self, parameters: 'CommonOptimizerParameters'): | ||
super().__init__(parameters) | ||
self.evaluator = parameters.evaluator | ||
|
||
def update_parameters(self, parameters: 'CommonOptimizerParameters'): | ||
return super().update_parameters(parameters) | ||
|
||
|
||
class Evaluator(Node): | ||
def __init__(self, name: str = 'evaluator'): | ||
self.name = name | ||
|
||
def __call__(self, task: EvaluatorTask): | ||
evaluated_inds = task.evaluator(task.generation) | ||
if evaluated_inds: | ||
task.generation = evaluated_inds | ||
task.status = TaskStatusEnum.SUCCESS | ||
else: | ||
task.status = TaskStatusEnum.FAIL | ||
return [task] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
36 changes: 36 additions & 0 deletions
36
golem/core/optimisers/common_optimizer/nodes/old_crossover.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
from golem.core.optimisers.common_optimizer.node import Node | ||
from golem.core.optimisers.genetic.operators.crossover import Crossover as OldCrossover | ||
from golem.core.optimisers.common_optimizer.task import TaskStatusEnum, TaskMixin | ||
|
||
|
||
class CrossoverTask(TaskMixin): | ||
def __init__(self, parameters: 'CommonOptimizerParameters'): | ||
super().__init__(parameters) | ||
self.graph_optimizer_params = parameters.graph_optimizer_params | ||
self.requirements = parameters.requirements | ||
self.graph_generation_params = parameters.graph_generation_params | ||
self.generation = parameters.population | ||
|
||
def update_parameters(self, parameters: 'CommonOptimizerParameters'): | ||
return super().update_parameters(parameters) | ||
|
||
|
||
class Crossover(Node): | ||
def __init__(self, name: str = 'crossover'): | ||
self.name = name | ||
self._crossover = None | ||
|
||
def __call__(self, task: CrossoverTask): | ||
if self._crossover is None: | ||
self._crossover = OldCrossover(task.graph_optimizer_params, | ||
task.requirements, | ||
task.graph_generation_params) | ||
task.generation = self._crossover(task.generation) | ||
task.status = TaskStatusEnum.SUCCESS | ||
|
||
new_tasks = list() | ||
for new_ind in task.generation: | ||
new_task = task.copy() | ||
new_task.generation = [new_ind] | ||
new_tasks.append(new_task) | ||
return new_tasks |
28 changes: 28 additions & 0 deletions
28
golem/core/optimisers/common_optimizer/nodes/old_elitism.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
from golem.core.optimisers.common_optimizer.node import Node | ||
from golem.core.optimisers.common_optimizer.task import TaskStatusEnum, TaskMixin | ||
from golem.core.optimisers.genetic.operators.elitism import Elitism as OldElitism | ||
|
||
|
||
|
||
class ElitismTask(TaskMixin): | ||
def __init__(self, parameters: 'CommonOptimizerParameters'): | ||
super().__init__(parameters) | ||
self.graph_optimizer_params = parameters.graph_optimizer_params | ||
self.generation = parameters.population | ||
self.best_individuals = None # TODO | ||
|
||
def update_parameters(self, parameters: 'CommonOptimizerParameters'): | ||
return super().update_parameters(parameters) | ||
|
||
|
||
class Elitism(Node): | ||
def __init__(self, name: str = 'elitism'): | ||
self.name = name | ||
self._regularization = None | ||
|
||
def __call__(self, task: ElitismTask): | ||
if self._regularization is None: | ||
self._regularization = OldElitism(task.graph_optimizer_params) | ||
task.generation = self._regularization(task.best_individuals, task.generation) | ||
task.status = TaskStatusEnum.SUCCESS | ||
return [task] |
28 changes: 28 additions & 0 deletions
28
golem/core/optimisers/common_optimizer/nodes/old_inheritance.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
from golem.core.optimisers.common_optimizer.node import Node | ||
from golem.core.optimisers.common_optimizer.task import TaskStatusEnum, TaskMixin | ||
from golem.core.optimisers.genetic.operators.inheritance import Inheritance as OldInheritance | ||
from golem.core.optimisers.genetic.operators.selection import Selection as OldSelection | ||
|
||
class InheritanceTask(TaskMixin): | ||
def __init__(self, parameters: 'CommonOptimizerParameters'): | ||
super().__init__(parameters) | ||
self.graph_optimizer_params = parameters.graph_optimizer_params | ||
self.generation = parameters.population | ||
self.origin_generation = parameters.population | ||
|
||
def update_parameters(self, parameters: 'CommonOptimizerParameters'): | ||
return super().update_parameters(parameters) | ||
|
||
|
||
class Inheritance(Node): | ||
def __init__(self, name: str = 'inheritance'): | ||
self.name = name | ||
self._inheritance = None | ||
|
||
def __call__(self, task: InheritanceTask): | ||
if self._inheritance is None: | ||
selection = OldSelection(task.graph_optimizer_params) | ||
self._inheritance = OldInheritance(task.graph_optimizer_params, selection) | ||
task.generation = self._inheritance(task.origin_generation, task.generation) | ||
task.status = TaskStatusEnum.SUCCESS | ||
return [task] |
34 changes: 34 additions & 0 deletions
34
golem/core/optimisers/common_optimizer/nodes/old_mutation.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
from golem.core.optimisers.common_optimizer.node import Node | ||
from golem.core.optimisers.common_optimizer.task import TaskStatusEnum, TaskMixin | ||
from golem.core.optimisers.genetic.operators.mutation import Mutation as OldMutation | ||
|
||
|
||
class MutationTask(TaskMixin): | ||
def __init__(self, parameters: 'CommonOptimizerParameters'): | ||
super().__init__(parameters) | ||
self.graph_optimizer_params = parameters.graph_optimizer_params | ||
self.requirements = parameters.requirements | ||
self.graph_generation_params = parameters.graph_generation_params | ||
self.generation = parameters.population | ||
|
||
def update_parameters(self, parameters: 'CommonOptimizerParameters'): | ||
return super().update_parameters(parameters) | ||
|
||
|
||
class Mutation(Node): | ||
def __init__(self, name: str = 'mutation'): | ||
self.name = name | ||
self._mutation = None | ||
|
||
def __call__(self, task: MutationTask): | ||
if self._mutation is None: | ||
self._mutation = OldMutation(task.graph_optimizer_params, | ||
task.requirements, | ||
task.graph_generation_params) | ||
ind = self._mutation(task.generation) | ||
if not ind: | ||
task.status = TaskStatusEnum.FAIL | ||
else: | ||
task.generation = [ind] | ||
task.status = TaskStatusEnum.SUCCESS | ||
return [task] |
30 changes: 30 additions & 0 deletions
30
golem/core/optimisers/common_optimizer/nodes/old_regularization.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
from golem.core.optimisers.common_optimizer.node import Node | ||
from golem.core.optimisers.common_optimizer.task import TaskStatusEnum, TaskMixin | ||
from golem.core.optimisers.genetic.operators.regularization import Regularization as OldRegularization | ||
|
||
|
||
|
||
class RegularizationTask(TaskMixin): | ||
def __init__(self, parameters: 'CommonOptimizerParameters'): | ||
super().__init__(parameters) | ||
self.graph_optimizer_params = parameters.graph_optimizer_params | ||
self.graph_generation_params = parameters.graph_generation_params | ||
self.generation = parameters.population | ||
self.evaluator = parameters.evaluator | ||
|
||
def update_parameters(self, parameters: 'CommonOptimizerParameters'): | ||
return super().update_parameters(parameters) | ||
|
||
|
||
class Regularization(Node): | ||
def __init__(self, name: str = 'regularization'): | ||
self.name = name | ||
self._regularization = None | ||
|
||
def __call__(self, task: RegularizationTask): | ||
if self._regularization is None: | ||
self._regularization = OldRegularization(task.graph_optimizer_params, | ||
task.graph_generation_params) | ||
task.generation = self._regularization(task.generation, task.evaluator) | ||
task.status = TaskStatusEnum.SUCCESS | ||
return [task] |
27 changes: 27 additions & 0 deletions
27
golem/core/optimisers/common_optimizer/nodes/old_selection.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
from golem.core.optimisers.common_optimizer.node import Node | ||
from golem.core.optimisers.common_optimizer.task import TaskStatusEnum, TaskMixin | ||
from golem.core.optimisers.genetic.operators.selection import Selection as OldSelection | ||
|
||
|
||
|
||
class SelectionTask(TaskMixin): | ||
def __init__(self, parameters: 'CommonOptimizerParameters'): | ||
super().__init__(parameters) | ||
self.graph_optimizer_params = parameters.graph_optimizer_params | ||
self.generation = parameters.population | ||
|
||
def update_parameters(self, parameters: 'CommonOptimizerParameters'): | ||
return super().update_parameters(parameters) | ||
|
||
|
||
class Selection(Node): | ||
def __init__(self, name: str = 'selection'): | ||
self.name = name | ||
self._selection = None | ||
|
||
def __call__(self, task: SelectionTask): | ||
if self._selection is None: | ||
self._selection = OldSelection(task.graph_optimizer_params) | ||
task.generation = self._selection(task.generation) | ||
task.status = TaskStatusEnum.SUCCESS | ||
return [task] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
""" Module with genetic optimization settings | ||
that reproduces behavior of default GOLEM | ||
genetic optimization """ | ||
from collections import defaultdict | ||
|
||
from golem.core.optimisers.common_optimizer.nodes.evaluator import Evaluator | ||
from golem.core.optimisers.common_optimizer.nodes.old_crossover import Crossover, CrossoverTask | ||
from golem.core.optimisers.common_optimizer.nodes.old_elitism import Elitism, ElitismTask | ||
from golem.core.optimisers.common_optimizer.nodes.old_inheritance import Inheritance, InheritanceTask | ||
from golem.core.optimisers.common_optimizer.nodes.old_mutation import Mutation, MutationTask | ||
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.stage import Stage | ||
from golem.core.optimisers.common_optimizer.task import Task, TaskStatusEnum | ||
|
||
default_stages = list() | ||
|
||
|
||
# adaptive parameters | ||
|
||
# main evolution process | ||
class EvolvePopulationTask(ElitismTask, MutationTask, | ||
CrossoverTask, RegularizationTask, | ||
SelectionTask, InheritanceTask, Task): | ||
def update_parameters(self, parameters: 'CommonOptimizerParameters'): | ||
parameters = super().update_parameters(parameters) | ||
return parameters | ||
|
||
scheme_map = dict() | ||
scheme_map[None] = defaultdict(lambda: 'regularization') | ||
scheme_map['regularization'] = defaultdict(lambda: 'selection') | ||
scheme_map['selection'] = defaultdict(lambda: 'crossover') | ||
scheme_map['crossover'] = defaultdict(lambda: 'mutation') | ||
scheme_map['mutation'] = {TaskStatusEnum.SUCCESS: 'evaluator', TaskStatusEnum.FAIL: None} | ||
scheme_map['evaluator'] = defaultdict(lambda: None) | ||
scheme = Scheme(scheme_map=scheme_map) | ||
|
||
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 parameter_updater(finished_tasks, parameters): | ||
parameters.new_population = [task.generation for task in finished_tasks] | ||
return parameters | ||
|
||
runner = OneThreadRunner() | ||
# runner = ParallelRunner() | ||
default_stages.append(Stage(runner=runner, nodes=nodes, task_builder=EvolvePopulationTask, | ||
scheme=scheme, stop_fun=stop_fun, parameter_updater=parameter_updater)) |