Skip to content

Commit bc47e1e

Browse files
committed
Update database.py
1 parent 86e5bcf commit bc47e1e

File tree

1 file changed

+45
-6
lines changed

1 file changed

+45
-6
lines changed

openevolve/database.py

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -897,25 +897,64 @@ def get_island_stats(self) -> List[dict]:
897897
return stats
898898

899899
def _calculate_island_diversity(self, programs: List[Program]) -> float:
900-
"""Calculate diversity within an island"""
900+
"""Calculate diversity within an island (optimized version)"""
901901
if len(programs) < 2:
902902
return 0.0
903903

904-
total_distance = 0
904+
total_diversity = 0
905905
comparisons = 0
906906

907-
# Sample up to 10 programs for efficiency
908-
sample_size = min(10, len(programs))
907+
# Sample fewer programs for performance
908+
sample_size = min(5, len(programs)) # Reduced from 10 to 5
909909
sample_programs = (
910910
random.sample(programs, sample_size) if len(programs) > sample_size else programs
911911
)
912912

913+
# Limit total comparisons for performance
914+
max_comparisons = 6 # Maximum comparisons to prevent long delays
915+
913916
for i, prog1 in enumerate(sample_programs):
914917
for prog2 in sample_programs[i + 1 :]:
915-
total_distance += calculate_edit_distance(prog1.code, prog2.code)
918+
if comparisons >= max_comparisons:
919+
break
920+
921+
# Use fast approximation instead of expensive edit distance
922+
diversity = self._fast_code_diversity(prog1.code, prog2.code)
923+
total_diversity += diversity
916924
comparisons += 1
925+
926+
if comparisons >= max_comparisons:
927+
break
928+
929+
return total_diversity / max(1, comparisons)
917930

918-
return total_distance / max(1, comparisons)
931+
def _fast_code_diversity(self, code1: str, code2: str) -> float:
932+
"""
933+
Fast approximation of code diversity using simple metrics
934+
935+
Returns diversity score (higher = more diverse)
936+
"""
937+
if code1 == code2:
938+
return 0.0
939+
940+
# Length difference (scaled to reasonable range)
941+
len1, len2 = len(code1), len(code2)
942+
length_diff = abs(len1 - len2)
943+
944+
# Line count difference
945+
lines1 = code1.count('\n')
946+
lines2 = code2.count('\n')
947+
line_diff = abs(lines1 - lines2)
948+
949+
# Simple character set difference
950+
chars1 = set(code1)
951+
chars2 = set(code2)
952+
char_diff = len(chars1.symmetric_difference(chars2))
953+
954+
# Combine metrics (scaled to match original edit distance range)
955+
diversity = (length_diff * 0.1 + line_diff * 10 + char_diff * 0.5)
956+
957+
return diversity
919958

920959
def log_island_status(self) -> None:
921960
"""Log current status of all islands"""

0 commit comments

Comments
 (0)