def test_seeding(space): """Verify that seeding makes sampling deterministic""" random_search = Random(space) random_search.seed_rng(1) a = random_search.suggest(1)[0] assert not numpy.allclose(a, random_search.suggest(1)[0]) random_search.seed_rng(1) assert numpy.allclose(a, random_search.suggest(1)[0])
def test_suggest_unique(): """Verify that RandomSearch do not sample duplicates""" space = Space() space.register(Integer('yolo1', 'uniform', -3, 6)) random_search = Random(space) n_samples = 6 values = sum(random_search.suggest(n_samples), tuple()) assert len(values) == n_samples assert len(set(values)) == n_samples
def test_set_state(space): """Verify that resetting state makes sampling deterministic""" random_search = Random(space) random_search.seed_rng(1) state = random_search.state_dict a = random_search.suggest(1)[0] assert not numpy.allclose(a, random_search.suggest(1)[0]) random_search.set_state(state) assert numpy.allclose(a, random_search.suggest(1)[0])
def test_suggest_unique_history(): """Verify that RandomSearch do not sample duplicates based observed points""" space = Space() space.register(Integer('yolo1', 'uniform', -3, 6)) random_search = Random(space) n_samples = 3 values = sum(random_search.suggest(n_samples), tuple()) assert len(values) == n_samples assert len(set(values)) == n_samples random_search.observe([[value] for value in values], [1] * n_samples) n_samples = 3 new_values = sum(random_search.suggest(n_samples), tuple()) assert len(new_values) == n_samples assert len(set(new_values)) == n_samples # No duplicates assert (set(new_values) & set(values)) == set()
def __init__( self, space, seed=None, population_size=50, generations=10, exploit=None, explore=None, fork_timeout=60, ): if exploit is None: exploit = { "of_type": "PipelineExploit", "exploit_configs": [ { "of_type": "BacktrackExploit", "min_forking_population": 5, "truncation_quantile": 0.9, "candidate_pool_ratio": 0.2, }, { "of_type": "TruncateExploit", "min_forking_population": 5, "truncation_quantile": 0.8, "candidate_pool_ratio": 0.2, }, ], } if explore is None: explore = { "of_type": "PipelineExplore", "explore_configs": [ {"of_type": "ResampleExplore", "probability": 0.2}, {"of_type": "PerturbExplore", "factor": 1.2, "volatility": 0.0001}, ], } self.random_search = Random(space) self._queue = [] fidelity_index = self.fidelity_index if fidelity_index is None: raise RuntimeError(SPACE_ERROR) self.fidelity_dim = space[fidelity_index] self.fidelities = compute_fidelities( generations, self.fidelity_dim.low, self.fidelity_dim.high, self.fidelity_dim.base, ) self.fidelity_upgrades = { a: b for a, b in zip(self.fidelities, self.fidelities[1:]) } logger.info("Executing PBT with fidelities: %s", self.fidelities) self.exploit_func = exploit_factory.create(**exploit) self.explore_func = explore_factory.create(**explore) self.lineages = Lineages() self._lineage_dropped_head = {} super(PBT, self).__init__( space, seed=seed, population_size=population_size, generations=generations, exploit=exploit, explore=explore, fork_timeout=fork_timeout, )
def __init__( self, space: Space, seed: int | Sequence[int] | None = None, population_size: int = 50, generations: int = 10, exploit: dict | None = None, explore: dict | None = None, fork_timeout: int = 60, ): if exploit is None: exploit = { "of_type": "PipelineExploit", "exploit_configs": [ { "of_type": "BacktrackExploit", "min_forking_population": 5, "truncation_quantile": 0.9, "candidate_pool_ratio": 0.2, }, { "of_type": "TruncateExploit", "min_forking_population": 5, "truncation_quantile": 0.8, "candidate_pool_ratio": 0.2, }, ], } if explore is None: explore = { "of_type": "PipelineExplore", "explore_configs": [ { "of_type": "ResampleExplore", "probability": 0.2 }, { "of_type": "PerturbExplore", "factor": 1.2, "volatility": 0.0001 }, ], } self.random_search = Random(space) self._queue: list[Trial] = [] fidelity_index = self.fidelity_index if fidelity_index is None: raise RuntimeError(SPACE_ERROR) fidelity_dim = space[fidelity_index] while isinstance(fidelity_dim, TransformedDimension): fidelity_dim = fidelity_dim.original_dimension assert isinstance(fidelity_dim, Fidelity) self.fidelity_dim = fidelity_dim self.fidelities = compute_fidelities( generations, self.fidelity_dim.low, self.fidelity_dim.high, self.fidelity_dim.base, ) self.fidelity_upgrades = dict(zip(self.fidelities, self.fidelities[1:])) logger.info("Executing PBT with fidelities: %s", self.fidelities) self.exploit_func = exploit_factory.create(**exploit) self.explore_func = explore_factory.create(**explore) self.lineages = Lineages() super().__init__(space) self.seed = seed self.population_size = population_size self.generations = generations self.exploit = exploit self.explore = explore self.fork_timeout = fork_timeout if seed is not None: self.seed_rng(seed=seed)