From 1688b45990fa7002ce78e6c38a280be43d17c708 Mon Sep 17 00:00:00 2001 From: nicl-nno Date: Thu, 28 Mar 2024 14:21:20 +0300 Subject: [PATCH 1/8] Random seed pass --- .../opt_history_objects/opt_history.py | 17 +++++++++++++++++ golem/core/optimisers/optimizer.py | 11 ++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/golem/core/optimisers/opt_history_objects/opt_history.py b/golem/core/optimisers/opt_history_objects/opt_history.py index dafc84ca..76837ae1 100644 --- a/golem/core/optimisers/opt_history_objects/opt_history.py +++ b/golem/core/optimisers/opt_history_objects/opt_history.py @@ -174,6 +174,23 @@ def all_historical_quality(self, metric_position: int = 0) -> List[float]: def show(self): return OptHistoryVisualizer(self) + # def analyze_online(self, url='https://fedot.onti.actcognitive.org'): + # case_id = FILE_NAME.replace('.json', '') + str(uuid4()) + # history_url = f'{DOMAIN}/ws/sandbox/custom_{case_id}/history' + # post_url = f"{DOMAIN}/api/showcase/add" + # + # history_json = json.load(open(BASE_PATH.joinpath(FILE_NAME))) + # new_case = { + # 'case': { + # 'case_id': case_id, + # }, + # 'history': history_json + # } + # response = requests.post(post_url, json=new_case) + # + # print(response.text, response.status_code, ) + # print(f'IMPORTANT! Save this url.\n{history_url}') + def get_leaderboard(self, top_n: int = 10) -> str: """ Prints ordered description of the best solutions in history diff --git a/golem/core/optimisers/optimizer.py b/golem/core/optimisers/optimizer.py index 86adf1a6..a6cfeae4 100644 --- a/golem/core/optimisers/optimizer.py +++ b/golem/core/optimisers/optimizer.py @@ -10,15 +10,16 @@ from golem.core.dag.verification_rules import DEFAULT_DAG_RULES from golem.core.log import default_log from golem.core.optimisers.advisor import DefaultChangeAdvisor -from golem.core.optimisers.optimization_parameters import OptimizationParameters from golem.core.optimisers.genetic.evaluation import DelegateEvaluator from golem.core.optimisers.genetic.operators.operator import PopulationT from golem.core.optimisers.graph import OptGraph from golem.core.optimisers.objective import GraphFunction, Objective, ObjectiveFunction from golem.core.optimisers.opt_history_objects.opt_history import OptHistory from golem.core.optimisers.opt_node_factory import DefaultOptNodeFactory, OptNodeFactory +from golem.core.optimisers.optimization_parameters import OptimizationParameters from golem.core.optimisers.random_graph_factory import RandomGraphFactory, RandomGrowthGraphFactory from golem.utilities.random import RandomStateHandler +from golem.utilities.utilities import set_random_seed STRUCTURAL_DIVERSITY_FREQUENCY_CHECK = 5 @@ -47,6 +48,7 @@ class AlgorithmParameters: adaptive_depth: bool = False adaptive_depth_max_stagnation: int = 3 structural_diversity_frequency_check: int = STRUCTURAL_DIVERSITY_FREQUENCY_CHECK + seed = None @dataclass @@ -102,8 +104,6 @@ class GraphOptimizer: :param requirements: implementation-independent requirements for graph optimizer :param graph_generation_params: parameters for new graph generation :param graph_optimizer_params: parameters for specific implementation of graph optimizer - - Additional custom params can be specified with `custom_optimizer_params`. """ def __init__(self, @@ -112,8 +112,7 @@ def __init__(self, # TODO: rename params to avoid confusion requirements: Optional[OptimizationParameters] = None, graph_generation_params: Optional[GraphGenerationParams] = None, - graph_optimizer_params: Optional[AlgorithmParameters] = None, - **custom_optimizer_params): + graph_optimizer_params: Optional[AlgorithmParameters] = None): self.log = default_log(self) self._objective = objective initial_graphs = graph_generation_params.adapter.adapt(initial_graphs) if initial_graphs else None @@ -125,6 +124,8 @@ def __init__(self, self._iteration_callback: IterationCallback = do_nothing_callback self._history = OptHistory(objective.get_info(), requirements.history_dir) \ if requirements and requirements.keep_history else None + + set_random_seed(self.graph_optimizer_params.seed) # Log random state for reproducibility of runs RandomStateHandler.log_random_state() From 3cdd36f2ac38a3bfe3fc2fd6e1a3bad2b9378f7a Mon Sep 17 00:00:00 2001 From: nicl-nno Date: Thu, 28 Mar 2024 14:32:19 +0300 Subject: [PATCH 2/8] Test move --- test/{unit => integration}/test_profiler.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/{unit => integration}/test_profiler.py (100%) diff --git a/test/unit/test_profiler.py b/test/integration/test_profiler.py similarity index 100% rename from test/unit/test_profiler.py rename to test/integration/test_profiler.py From 3799d8c904d0a90e46558c5a20ce14976e5eee68 Mon Sep 17 00:00:00 2001 From: nicl-nno Date: Thu, 28 Mar 2024 14:45:12 +0300 Subject: [PATCH 3/8] Fix --- golem/utilities/utilities.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/golem/utilities/utilities.py b/golem/utilities/utilities.py index 7cff0b20..106b29c7 100644 --- a/golem/utilities/utilities.py +++ b/golem/utilities/utilities.py @@ -4,7 +4,7 @@ import numpy as np from joblib import cpu_count -from golem.utilities import random +import random from golem.utilities.random import RandomStateHandler From 267f37cd9c07992bc3d100ba7f2bbcb783471f70 Mon Sep 17 00:00:00 2001 From: nicl-nno Date: Thu, 28 Mar 2024 17:14:41 +0300 Subject: [PATCH 4/8] Imp 2 --- golem/core/optimisers/adaptive/agent_trainer.py | 11 ++++++----- golem/utilities/utilities.py | 3 +-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/golem/core/optimisers/adaptive/agent_trainer.py b/golem/core/optimisers/adaptive/agent_trainer.py index 80e9b6c9..f3f4a2db 100644 --- a/golem/core/optimisers/adaptive/agent_trainer.py +++ b/golem/core/optimisers/adaptive/agent_trainer.py @@ -56,7 +56,7 @@ def fit(self, histories: Iterable[OptHistory], validate_each: int = -1) -> Opera # Preliminary validity check # This allows to filter out histories with different objectives automatically if history.objective.metric_names != self.objective.metric_names: - self._log.warning(f'History #{i+1} has different objective! ' + self._log.warning(f'History #{i + 1} has different objective! ' f'Expected {self.objective}, got {history.objective}.') continue @@ -67,13 +67,13 @@ def fit(self, histories: Iterable[OptHistory], validate_each: int = -1) -> Opera experience, val_experience = experience.split(ratio=0.8, shuffle=True) # Train - self._log.info(f'Training on history #{i+1} with {len(history.generations)} generations') + self._log.info(f'Training on history #{i + 1} with {len(history.generations)} generations') self.agent.partial_fit(experience) # Validate if val_experience: reward_loss, reward_target = self.validate_agent(experience=val_experience) - self._log.info(f'Agent validation for history #{i+1} & {experience}: ' + self._log.info(f'Agent validation for history #{i + 1} & {experience}: ' f'Reward target={reward_target:.3f}, loss={reward_loss:.3f}') # Reset mutation probabilities to default @@ -163,9 +163,10 @@ def _apply_best_action(self, inds: Sequence[Individual]) -> TrajectoryStep: return best_step def _apply_action(self, action: Any, ind: Individual) -> TrajectoryStep: - new_graph, applied = self.mutation._adapt_and_apply_mutation(ind.graph, action) + new_graph = self.mutation._apply_mutations(ind.graph, action) + applied = new_graph is not None fitness = self._eval_objective(new_graph) if applied else None - parent_op = ParentOperator(type_='mutation', operators=applied, parent_individuals=ind) + parent_op = ParentOperator(type_='mutation', operators=applied, parent_individuals=[ind]) new_ind = Individual(new_graph, fitness=fitness, parent_operator=parent_op) prev_fitness = ind.fitness or self._eval_objective(ind.graph) diff --git a/golem/utilities/utilities.py b/golem/utilities/utilities.py index 106b29c7..e7337ada 100644 --- a/golem/utilities/utilities.py +++ b/golem/utilities/utilities.py @@ -1,10 +1,9 @@ -import logging +import random from typing import Optional import numpy as np from joblib import cpu_count -import random from golem.utilities.random import RandomStateHandler From 5b8a4f30f9ef1ad086dd26b45b9bf3a8397a0d02 Mon Sep 17 00:00:00 2001 From: Lyubov Yamshchikova Date: Mon, 8 Apr 2024 14:27:19 +0300 Subject: [PATCH 5/8] Fix multiobj --- golem/core/tuning/tuner_interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/golem/core/tuning/tuner_interface.py b/golem/core/tuning/tuner_interface.py index 098c3734..6e12aa0b 100644 --- a/golem/core/tuning/tuner_interface.py +++ b/golem/core/tuning/tuner_interface.py @@ -180,7 +180,7 @@ def _multi_obj_final_check(self, tuned_graphs: Sequence[OptGraph]) -> Sequence[O else: self.log.message('Initial metric dominates all found solutions. Return initial graph.') final_graphs = self.init_graph - self.obtained_metric = self.init_metric + self.obtained_metric = ensure_wrapped_in_sequence(self.init_metric) return final_graphs def get_metric_value(self, graph: OptGraph) -> Union[float, Sequence[float]]: From 315c341b5e75230c7952e5702c97be548db9b6ed Mon Sep 17 00:00:00 2001 From: Lyubov Yamshchikova Date: Mon, 8 Apr 2024 14:35:50 +0300 Subject: [PATCH 6/8] Fix multiobj --- golem/core/tuning/tuner_interface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/golem/core/tuning/tuner_interface.py b/golem/core/tuning/tuner_interface.py index 6e12aa0b..69e5321e 100644 --- a/golem/core/tuning/tuner_interface.py +++ b/golem/core/tuning/tuner_interface.py @@ -179,8 +179,8 @@ def _multi_obj_final_check(self, tuned_graphs: Sequence[OptGraph]) -> Sequence[O f'{metrics_formatted}') else: self.log.message('Initial metric dominates all found solutions. Return initial graph.') - final_graphs = self.init_graph - self.obtained_metric = ensure_wrapped_in_sequence(self.init_metric) + final_graphs = [self.init_graph] + self.obtained_metric = [self.init_metric] return final_graphs def get_metric_value(self, graph: OptGraph) -> Union[float, Sequence[float]]: From a229e06e34038b1b4826ee3f39627a64b924f8c4 Mon Sep 17 00:00:00 2001 From: nicl-nno Date: Fri, 15 Nov 2024 21:46:40 +0300 Subject: [PATCH 7/8] Code review fixes --- .../opt_history_objects/opt_history.py | 17 ----------------- golem/core/optimisers/optimizer.py | 4 ++-- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/golem/core/optimisers/opt_history_objects/opt_history.py b/golem/core/optimisers/opt_history_objects/opt_history.py index 76837ae1..dafc84ca 100644 --- a/golem/core/optimisers/opt_history_objects/opt_history.py +++ b/golem/core/optimisers/opt_history_objects/opt_history.py @@ -174,23 +174,6 @@ def all_historical_quality(self, metric_position: int = 0) -> List[float]: def show(self): return OptHistoryVisualizer(self) - # def analyze_online(self, url='https://fedot.onti.actcognitive.org'): - # case_id = FILE_NAME.replace('.json', '') + str(uuid4()) - # history_url = f'{DOMAIN}/ws/sandbox/custom_{case_id}/history' - # post_url = f"{DOMAIN}/api/showcase/add" - # - # history_json = json.load(open(BASE_PATH.joinpath(FILE_NAME))) - # new_case = { - # 'case': { - # 'case_id': case_id, - # }, - # 'history': history_json - # } - # response = requests.post(post_url, json=new_case) - # - # print(response.text, response.status_code, ) - # print(f'IMPORTANT! Save this url.\n{history_url}') - def get_leaderboard(self, top_n: int = 10) -> str: """ Prints ordered description of the best solutions in history diff --git a/golem/core/optimisers/optimizer.py b/golem/core/optimisers/optimizer.py index a6cfeae4..23ec1cb1 100644 --- a/golem/core/optimisers/optimizer.py +++ b/golem/core/optimisers/optimizer.py @@ -109,10 +109,10 @@ class GraphOptimizer: def __init__(self, objective: Objective, initial_graphs: Optional[Sequence[Union[Graph, Any]]] = None, - # TODO: rename params to avoid confusion requirements: Optional[OptimizationParameters] = None, graph_generation_params: Optional[GraphGenerationParams] = None, - graph_optimizer_params: Optional[AlgorithmParameters] = None): + graph_optimizer_params: Optional[ + AlgorithmParameters] = None): # check if correct for inherited optimizers self.log = default_log(self) self._objective = objective initial_graphs = graph_generation_params.adapter.adapt(initial_graphs) if initial_graphs else None From 887855f9817aeeb21c531fe8282c8deafc960501 Mon Sep 17 00:00:00 2001 From: nicl-nno Date: Fri, 15 Nov 2024 21:50:18 +0300 Subject: [PATCH 8/8] Mirror fix --- .github/workflows/mirror_repo_to_gitlab.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mirror_repo_to_gitlab.yml b/.github/workflows/mirror_repo_to_gitlab.yml index 513c963e..0a16262b 100644 --- a/.github/workflows/mirror_repo_to_gitlab.yml +++ b/.github/workflows/mirror_repo_to_gitlab.yml @@ -4,7 +4,7 @@ on: [push, pull_request, delete] jobs: call-nss-ops-mirror-workflow: - uses: ITMO-NSS-team/NSS-Ops/.github/workflows/mirror-repo.yml@master + uses: aimclub/open-source-ops/.github/workflows/mirror-repo.yml@master with: GITLAB_URL: 'https://gitlab.actcognitive.org/itmo-nss-team/GOLEM' secrets: