From 8a263e737c40afda8b35367da7fa0b21e1075bce Mon Sep 17 00:00:00 2001 From: Asankhaya Sharma Date: Fri, 20 Jun 2025 22:21:09 +0800 Subject: [PATCH 1/2] Improve error logging and handle stale feature map references Use logger.exception for better error tracebacks in controller.py. In database.py, ensure feature map entries are updated if the referenced program no longer exists, preventing stale references and improving robustness. --- openevolve/controller.py | 3 +-- openevolve/database.py | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/openevolve/controller.py b/openevolve/controller.py index 1656f557bb..e9cbe774bd 100644 --- a/openevolve/controller.py +++ b/openevolve/controller.py @@ -405,8 +405,7 @@ async def run( break except Exception as e: - logger.error(f"Error in iteration {i+1}: {str(e)}") - traceback.print_exc() + logger.exception(f"Error in iteration {i+1}: {str(e)}") continue # Get the best program using our tracking mechanism diff --git a/openevolve/database.py b/openevolve/database.py index d7526f7291..7b8e756360 100644 --- a/openevolve/database.py +++ b/openevolve/database.py @@ -161,9 +161,20 @@ def add( # Add to feature map (replacing existing if better) feature_key = self._feature_coords_to_key(feature_coords) - if feature_key not in self.feature_map or self._is_better( - program, self.programs[self.feature_map[feature_key]] - ): + should_replace = feature_key not in self.feature_map + + if not should_replace: + # Check if the existing program still exists before comparing + existing_program_id = self.feature_map[feature_key] + if existing_program_id not in self.programs: + # Stale reference, replace it + should_replace = True + logger.debug(f"Replacing stale program reference {existing_program_id} in feature map") + else: + # Program exists, compare fitness + should_replace = self._is_better(program, self.programs[existing_program_id]) + + if should_replace: self.feature_map[feature_key] = program.id # Add to specific island (not random!) From 2d7abb088a50332601a4f34b83bf7f12f98dd6a0 Mon Sep 17 00:00:00 2001 From: Asankhaya Sharma Date: Fri, 20 Jun 2025 22:22:15 +0800 Subject: [PATCH 2/2] Refactor long string assignments for readability Reformatted multi-line string assignments and logging statements to improve code readability and maintain consistency across evaluator, run_benchmarks, controller, and database modules. No functional changes were made. --- examples/circle_packing_with_artifacts/evaluator.py | 12 ++++++------ examples/mlx_metal_kernel_opt/run_benchmarks.py | 4 +--- openevolve/controller.py | 4 +--- openevolve/database.py | 8 +++++--- 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/examples/circle_packing_with_artifacts/evaluator.py b/examples/circle_packing_with_artifacts/evaluator.py index ea32025468..a8692c9367 100644 --- a/examples/circle_packing_with_artifacts/evaluator.py +++ b/examples/circle_packing_with_artifacts/evaluator.py @@ -295,9 +295,9 @@ def evaluate(program_path): # Add successful packing stats for good solutions if valid and target_ratio > 0.95: # Near-optimal solutions artifacts["stdout"] = f"Excellent packing! Achieved {target_ratio:.1%} of target value" - artifacts["radius_stats"] = ( - f"Min: {validation_details['min_radius']:.6f}, Max: {validation_details['max_radius']:.6f}, Avg: {validation_details['avg_radius']:.6f}" - ) + artifacts[ + "radius_stats" + ] = f"Min: {validation_details['min_radius']:.6f}, Max: {validation_details['max_radius']:.6f}, Avg: {validation_details['avg_radius']:.6f}" return EvaluationResult( metrics={ @@ -404,9 +404,9 @@ def evaluate_stage1(program_path): # Add validation issues if any if not valid: - artifacts["stderr"] = ( - f"Validation failed: {len(validation_details.get('boundary_violations', []))} boundary violations, {len(validation_details.get('overlaps', []))} overlaps" - ) + artifacts[ + "stderr" + ] = f"Validation failed: {len(validation_details.get('boundary_violations', []))} boundary violations, {len(validation_details.get('overlaps', []))} overlaps" artifacts["failure_stage"] = "stage1_geometric_validation" if validation_details.get("boundary_violations"): artifacts["boundary_issues"] = validation_details["boundary_violations"][ diff --git a/examples/mlx_metal_kernel_opt/run_benchmarks.py b/examples/mlx_metal_kernel_opt/run_benchmarks.py index bc7c5fc2b5..3095a85231 100644 --- a/examples/mlx_metal_kernel_opt/run_benchmarks.py +++ b/examples/mlx_metal_kernel_opt/run_benchmarks.py @@ -457,9 +457,7 @@ def print_comparison_summary(comparison_results): print(f" ā±ļø Average Time Reduction: {summary['avg_time_reduction_pct']:+.2f}%") print(f"\nšŸ“Š ABSOLUTE PERFORMANCE:") - print( - f" šŸ”µ Standard MLX-LM: {summary['avg_standard_decode_speed']:.1f} tokens/sec average" - ) + print(f" šŸ”µ Standard MLX-LM: {summary['avg_standard_decode_speed']:.1f} tokens/sec average") print( f" 🟠 Metal Kernel Optimized: {summary['avg_optimized_decode_speed']:.1f} tokens/sec average" ) diff --git a/openevolve/controller.py b/openevolve/controller.py index e9cbe774bd..472a6c372b 100644 --- a/openevolve/controller.py +++ b/openevolve/controller.py @@ -376,9 +376,7 @@ async def run( # Specifically check if this is the new best program if self.database.best_program_id == child_program.id: - logger.info( - f"🌟 New best solution found at iteration {i+1}: {child_program.id}" - ) + logger.info(f"🌟 New best solution found at iteration {i+1}: {child_program.id}") logger.info(f"Metrics: {format_metrics_safe(child_program.metrics)}") # Save checkpoint diff --git a/openevolve/database.py b/openevolve/database.py index 7b8e756360..0f8c73742f 100644 --- a/openevolve/database.py +++ b/openevolve/database.py @@ -162,18 +162,20 @@ def add( # Add to feature map (replacing existing if better) feature_key = self._feature_coords_to_key(feature_coords) should_replace = feature_key not in self.feature_map - + if not should_replace: # Check if the existing program still exists before comparing existing_program_id = self.feature_map[feature_key] if existing_program_id not in self.programs: # Stale reference, replace it should_replace = True - logger.debug(f"Replacing stale program reference {existing_program_id} in feature map") + logger.debug( + f"Replacing stale program reference {existing_program_id} in feature map" + ) else: # Program exists, compare fitness should_replace = self._is_better(program, self.programs[existing_program_id]) - + if should_replace: self.feature_map[feature_key] = program.id