Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions archai/discrete_search/algos/bananas.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ def mutate_parents(
nb_tries = 0

while len(candidates) < mutations_per_parent and nb_tries < patience:
nb_tries += 1
mutated_model = self.search_space.mutate(p)
mutated_model.metadata["parent"] = p.archid

Expand All @@ -176,8 +177,6 @@ def mutate_parents(
if mutated_model.archid not in self.seen_archs:
candidates[mutated_model.archid] = mutated_model

nb_tries += 1

mutations.update(candidates)

if len(mutations) == 0:
Expand Down
2 changes: 1 addition & 1 deletion archai/discrete_search/algos/local_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ def mutate_parents(
nb_tries = 0

while len(candidates) < mutations_per_parent and nb_tries < patience:
nb_tries += 1
mutated_model = self.search_space.mutate(p)
mutated_model.metadata["parent"] = p.archid

Expand All @@ -131,7 +132,6 @@ def mutate_parents(
if mutated_model.archid not in self.seen_archs:
mutated_model.metadata["generation"] = self.iter_num
candidates[mutated_model.archid] = mutated_model
nb_tries += 1
mutations.update(candidates)

return list(mutations.values())
Expand Down
2 changes: 1 addition & 1 deletion archai/discrete_search/algos/regularized_evolution.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ def mutate_parents(
nb_tries = 0

while len(candidates) < mutations_per_parent and nb_tries < patience:
nb_tries += 1
mutated_model = self.search_space.mutate(p)
mutated_model.metadata["parent"] = p.archid

Expand All @@ -144,7 +145,6 @@ def mutate_parents(
if mutated_model.archid not in self.seen_archs:
mutated_model.metadata["generation"] = self.iter_num
candidates[mutated_model.archid] = mutated_model
nb_tries += 1
mutations.update(candidates)

return list(mutations.values())
Expand Down
29 changes: 29 additions & 0 deletions tests/discrete_search/algos/test_bananas.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,32 @@ def test_bananas(output_dir, search_space, search_objectives, surrogate_model):
# Checks if all registered models satisfy constraints
_, valid_models = search_objectives.validate_constraints(all_models)
assert len(valid_models) == len(all_models)


def test_bananas_mutate_parents_stops_on_invalid_mutations(
output_dir, search_space, search_objectives, surrogate_model, monkeypatch
):
algo = MoBananasSearch(
search_space=search_space,
search_objectives=search_objectives,
output_dir=output_dir,
surrogate_model=surrogate_model,
num_iters=2,
init_num_models=5,
)

mutate_calls = []

def counting_mutate(model):
mutate_calls.append(model.archid)
# Fails instead of hanging if `patience` is not honored
assert len(mutate_calls) <= 3
return mutate(model)

mutate = search_space.mutate
monkeypatch.setattr(search_space, "mutate", counting_mutate)
monkeypatch.setattr(algo.so, "is_model_valid", lambda model: False)

parent = search_space.random_sample()
assert algo.mutate_parents([parent], mutations_per_parent=1, patience=3) == []
assert len(mutate_calls) == 3
29 changes: 29 additions & 0 deletions tests/discrete_search/algos/test_local_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,32 @@ def test_local_search(output_dir, search_space, search_objectives):
# Checks if all registered models satisfy constraints
_, valid_models = search_objectives.validate_constraints(all_models)
assert len(valid_models) == len(all_models)


def test_local_search_mutate_parents_stops_on_invalid_mutations(
output_dir, search_space, search_objectives, monkeypatch
):
algo = LocalSearch(
search_space,
search_objectives,
output_dir,
num_iters=2,
init_num_models=5,
seed=1,
)

mutate_calls = []

def counting_mutate(model):
mutate_calls.append(model.archid)
# Fails instead of hanging if `patience` is not honored
assert len(mutate_calls) <= 3
return mutate(model)

mutate = search_space.mutate
monkeypatch.setattr(search_space, "mutate", counting_mutate)
monkeypatch.setattr(algo.so, "is_model_valid", lambda model: False)

parent = search_space.random_sample()
assert algo.mutate_parents([parent], mutations_per_parent=1, patience=3) == []
assert len(mutate_calls) == 3
31 changes: 31 additions & 0 deletions tests/discrete_search/algos/test_regularized_evolution.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,34 @@ def test_regularized_evolution(output_dir, search_space, search_objectives, surr
# Checks if all registered models satisfy constraints
_, valid_models = search_objectives.validate_constraints(all_models)
assert len(valid_models) == len(all_models)


def test_regularized_evolution_mutate_parents_stops_on_invalid_mutations(
output_dir, search_space, search_objectives, monkeypatch
):
algo = RegularizedEvolutionSearch(
search_space=search_space,
search_objectives=search_objectives,
output_dir=output_dir,
num_iters=2,
init_num_models=4,
pareto_sample_size=4,
history_size=10,
seed=1,
)

mutate_calls = []

def counting_mutate(model):
mutate_calls.append(model.archid)
# Fails instead of hanging if `patience` is not honored
assert len(mutate_calls) <= 3
return mutate(model)

mutate = search_space.mutate
monkeypatch.setattr(search_space, "mutate", counting_mutate)
monkeypatch.setattr(algo.so, "is_model_valid", lambda model: False)

parent = search_space.random_sample()
assert algo.mutate_parents([parent], mutations_per_parent=1, patience=3) == []
assert len(mutate_calls) == 3