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 1656f557b..e9cbe774b 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 d7526f729..7b8e75636 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 ea3202546..a8692c936 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 bc7c5fc2b..3095a8523 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 e9cbe774b..472a6c372 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 7b8e75636..0f8c73742 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