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
25 changes: 11 additions & 14 deletions openevolve/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -743,30 +743,27 @@ def _enforce_population_limit(self) -> None:
additional_removals = remaining_programs[: num_to_remove - len(programs_to_remove)]
programs_to_remove.extend(additional_removals)

# Remove the selected programs
# Remove from main dictionary and their respective islands
for program in programs_to_remove:
program_id = program.id

# Remove from main programs dict
if program_id in self.programs:
del self.programs[program_id]

# Remove from feature map
keys_to_remove = []
for key, pid in self.feature_map.items():
if pid == program_id:
keys_to_remove.append(key)
for key in keys_to_remove:
del self.feature_map[key]

# Remove from islands
# Also remove from islands
for island in self.islands:
island.discard(program_id)

# Remove from archive
# CRITICAL FIX: Also remove from archive and feature_map
self.archive.discard(program_id)

logger.debug(f"Removed program {program_id} due to population limit")
# Remove from feature_map if it's the one stored there
keys_to_remove = [
key for key, value in self.feature_map.items() if value == program_id
]
for key in keys_to_remove:
del self.feature_map[key]

logger.info(f"Removed program {program_id} to maintain population size.")

logger.info(f"Population size after cleanup: {len(self.programs)}")

Expand Down
10 changes: 8 additions & 2 deletions scripts/visualizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,17 @@ def find_latest_checkpoint(base_folder):
if os.path.basename(base_folder).startswith("checkpoint_"):
return base_folder

checkpoint_folders = glob.glob("**/checkpoint_*", root_dir=base_folder, recursive=True)
# checkpoint_folders = glob.glob("**/checkpoint_*", root_dir=base_folder, recursive=True)
# glob.glob 没有 root_dir 参数,需手动递归遍历
checkpoint_folders = []
for root, dirs, files in os.walk(base_folder):
for d in dirs:
if d.startswith("checkpoint_"):
checkpoint_folders.append(os.path.join(root, d))

if not checkpoint_folders:
logger.info(f"No checkpoint folders found in {base_folder}")
return None
checkpoint_folders = [os.path.join(base_folder, folder) for folder in checkpoint_folders]
checkpoint_folders.sort(key=lambda x: os.path.getmtime(x), reverse=True)
logger.debug(f"Found checkpoint folder: {checkpoint_folders[0]}")
return checkpoint_folders[0]
Expand Down