@@ -58,6 +58,7 @@ class ProgramDatabase:
5858
5959 The database implements a combination of MAP-Elites algorithm and
6060 island-based population model to maintain diversity during evolution.
61+ It also tracks the absolute best program separately to ensure it's never lost.
6162 """
6263
6364 def __init__ (self , config : DatabaseConfig ):
@@ -76,6 +77,9 @@ def __init__(self, config: DatabaseConfig):
7677 # Archive of elite programs
7778 self .archive : Set [str ] = set ()
7879
80+ # Track the absolute best program separately
81+ self .best_program_id : Optional [str ] = None
82+
7983 # Load database from disk if path is provided
8084 if config .db_path and os .path .exists (config .db_path ):
8185 self .load (config .db_path )
@@ -112,6 +116,9 @@ def add(self, program: Program) -> str:
112116 # Update archive
113117 self ._update_archive (program )
114118
119+ # Update the absolute best program tracking
120+ self ._update_best_program (program )
121+
115122 # Save to disk if configured
116123 if self .config .db_path :
117124 self ._save_program (program )
@@ -160,6 +167,10 @@ def get_best_program(self, metric: Optional[str] = None) -> Optional[Program]:
160167 if not self .programs :
161168 return None
162169
170+ # If no specific metric and we have a tracked best program, return it
171+ if metric is None and self .best_program_id and self .best_program_id in self .programs :
172+ return self .programs [self .best_program_id ]
173+
163174 if metric :
164175 # Sort by specific metric
165176 sorted_programs = sorted (
@@ -174,6 +185,13 @@ def get_best_program(self, metric: Optional[str] = None) -> Optional[Program]:
174185 key = lambda p : sum (p .metrics .values ()) / max (1 , len (p .metrics )),
175186 reverse = True
176187 )
188+
189+ # Update the best program tracking if we found a better program
190+ if sorted_programs and (self .best_program_id is None or
191+ sorted_programs [0 ].id != self .best_program_id ):
192+ old_id = self .best_program_id
193+ self .best_program_id = sorted_programs [0 ].id
194+ logger .info (f"Updated best program tracking: { self .best_program_id } " )
177195
178196 return sorted_programs [0 ] if sorted_programs else None
179197
@@ -236,6 +254,7 @@ def save(self, path: Optional[str] = None) -> None:
236254 "feature_map" : self .feature_map ,
237255 "islands" : [list (island ) for island in self .islands ],
238256 "archive" : list (self .archive ),
257+ "best_program_id" : self .best_program_id ,
239258 }
240259
241260 with open (os .path .join (save_path , "metadata.json" ), "w" ) as f :
@@ -263,6 +282,7 @@ def load(self, path: str) -> None:
263282 self .feature_map = metadata .get ("feature_map" , {})
264283 self .islands = [set (island ) for island in metadata .get ("islands" , [])]
265284 self .archive = set (metadata .get ("archive" , []))
285+ self .best_program_id = metadata .get ("best_program_id" )
266286
267287 # Load programs
268288 programs_dir = os .path .join (path , "programs" )
@@ -425,6 +445,39 @@ def _update_archive(self, program: Program) -> None:
425445 if self ._is_better (program , worst_program ):
426446 self .archive .remove (worst_program .id )
427447 self .archive .add (program .id )
448+
449+ def _update_best_program (self , program : Program ) -> None :
450+ """
451+ Update the absolute best program tracking
452+
453+ Args:
454+ program: Program to consider as the new best
455+ """
456+ # If we don't have a best program yet, this becomes the best
457+ if self .best_program_id is None :
458+ self .best_program_id = program .id
459+ logger .debug (f"Set initial best program to { program .id } " )
460+ return
461+
462+ # Compare with current best program
463+ current_best = self .programs [self .best_program_id ]
464+
465+ # Update if the new program is better
466+ if self ._is_better (program , current_best ):
467+ old_id = self .best_program_id
468+ self .best_program_id = program .id
469+ logger .info (f"New best program { program .id } replaces { old_id } " )
470+
471+ # Log improvement in metrics
472+ if program .metrics and current_best .metrics :
473+ improvements = []
474+ for metric , value in program .metrics .items ():
475+ if metric in current_best .metrics :
476+ diff = value - current_best .metrics [metric ]
477+ improvements .append (f"{ metric } : { diff :+.4f} " )
478+
479+ if improvements :
480+ logger .info (f"Metric improvements: { ', ' .join (improvements )} " )
428481
429482 def _sample_parent (self ) -> Program :
430483 """
@@ -466,13 +519,21 @@ def _sample_inspirations(
466519 """
467520 inspirations = []
468521
522+ # Always include the absolute best program if available and different from parent
523+ if self .best_program_id is not None and self .best_program_id != parent .id :
524+ best_program = self .programs [self .best_program_id ]
525+ inspirations .append (best_program )
526+ logger .debug (f"Including best program { self .best_program_id } in inspirations" )
527+
469528 # Add top programs as inspirations
470529 top_n = max (1 , int (n * self .config .elite_selection_ratio ))
471530 top_programs = self .get_top_programs (n = top_n )
472- inspirations .extend (top_programs )
531+ for program in top_programs :
532+ if program .id not in [p .id for p in inspirations ] and program .id != parent .id :
533+ inspirations .append (program )
473534
474535 # Add diverse programs
475- if len (self .programs ) > n :
536+ if len (self .programs ) > n and len ( inspirations ) < n :
476537 # Sample from different feature cells
477538 feature_coords = self ._calculate_feature_coords (parent )
478539
0 commit comments