From 27d96d76af81c1d28ce69b3abb043d74a1abdc07 Mon Sep 17 00:00:00 2001 From: donRumata03 Date: Wed, 17 Apr 2024 01:39:31 +0300 Subject: [PATCH] Add test that seed fully determines evolution process --- golem/utilities/utilities.py | 9 ++++++- test/conftest.py | 7 +----- test/unit/utilities/random_seeds.py | 39 +++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 test/unit/utilities/random_seeds.py diff --git a/golem/utilities/utilities.py b/golem/utilities/utilities.py index 7cff0b20..3bd8e270 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 @@ -22,6 +22,13 @@ def determine_n_jobs(n_jobs=-1, logger=None): return n_jobs +def urandom_mock(n): + # os.random is the source of random used in the uuid library + # normally, it's „true“ random, but to stabilize tests, + # seeded `random` library is used instead. + return bytes(random.getrandbits(8) for _ in range(n)) + + def set_random_seed(seed: Optional[int]): """ Sets random seed for evaluation of models. """ if seed is not None: diff --git a/test/conftest.py b/test/conftest.py index 24849aad..7d10e937 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -3,6 +3,7 @@ import pytest +from golem.utilities.utilities import urandom_mock from golem.utilities.utils import set_random_seed @@ -10,11 +11,5 @@ def stabilize_random(): set_random_seed(42) - def urandom_mock(n): - return bytes(random.getrandbits(8) for _ in range(n)) - - # os.random is the source of random used in the uuid library - # normally, it's „true“ random, but to stabilize tests, - # it uses seeded `random` library with patch('os.urandom', urandom_mock): yield diff --git a/test/unit/utilities/random_seeds.py b/test/unit/utilities/random_seeds.py new file mode 100644 index 00000000..80bacc26 --- /dev/null +++ b/test/unit/utilities/random_seeds.py @@ -0,0 +1,39 @@ +from unittest.mock import patch + +from examples.synthetic_graph_evolution.generators import generate_labeled_graph +from examples.synthetic_graph_evolution.graph_search import graph_search_setup +from golem.utilities.utilities import set_random_seed, urandom_mock +from test.integration.test_quality_improvement import run_graph_trial + + +def test_random_seed_fully_determines_evolution_process(): + """ Tests that random seed fully determines evolution process. """ + # Setup graph search + target_graph = generate_labeled_graph('gnp', 5, node_labels=['X', 'Y']) + + def launch_with_seed(seed): + set_random_seed(seed) + optimizer, objective = graph_search_setup( + target_graph=target_graph, + num_iterations=3, + node_types=['X', 'Y'], + pop_size=3 + ) + optimizer.optimise(objective) + return optimizer.history + + def history_equals(history1, history2): + return all( + (history1.generations[i] == history2.generations[i]) + for i in range(len(history1.generations)) + ) + + first_seed = 42 + second_seed = first_seed + 1 + + first_seed_first_run = launch_with_seed(first_seed) + first_seed_second_run = launch_with_seed(first_seed) + second_seed_run = launch_with_seed(second_seed) + + assert history_equals(first_seed_first_run, first_seed_second_run) + assert not history_equals(first_seed_first_run, second_seed_run)