@@ -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