diff --git a/openevolve/utils/format_utils.py b/openevolve/utils/format_utils.py index 4dd83c7ac0..66926423fd 100644 --- a/openevolve/utils/format_utils.py +++ b/openevolve/utils/format_utils.py @@ -20,8 +20,10 @@ def format_metrics_safe(metrics: Dict[str, Any]) -> str: formatted_parts = [] for name, value in metrics.items(): - # Check if value is numeric (int, float) - if isinstance(value, (int, float)): + # bool is a subclass of int, but logging it as 1.0000/0.0000 is confusing. + if isinstance(value, bool): + formatted_parts.append(f"{name}={value}") + elif isinstance(value, (int, float)): try: # Only apply float formatting to numeric values formatted_parts.append(f"{name}={value:.4f}") @@ -54,7 +56,12 @@ def format_improvement_safe(parent_metrics: Dict[str, Any], child_metrics: Dict[ if metric in parent_metrics: parent_value = parent_metrics[metric] # Only calculate improvement for numeric values - if isinstance(child_value, (int, float)) and isinstance(parent_value, (int, float)): + if ( + isinstance(child_value, (int, float)) + and isinstance(parent_value, (int, float)) + and not isinstance(child_value, bool) + and not isinstance(parent_value, bool) + ): try: diff = child_value - parent_value improvement_parts.append(f"{metric}={diff:+.4f}") diff --git a/tests/test_format_utils.py b/tests/test_format_utils.py new file mode 100644 index 0000000000..d9d8751f25 --- /dev/null +++ b/tests/test_format_utils.py @@ -0,0 +1,15 @@ +from openevolve.utils.format_utils import format_improvement_safe, format_metrics_safe + + +def test_format_metrics_safe_preserves_boolean_values(): + assert format_metrics_safe({"valid": True, "score": 0.25}) == "valid=True, score=0.2500" + + +def test_format_improvement_safe_ignores_boolean_diffs(): + assert ( + format_improvement_safe( + {"valid": False, "score": 0.25}, + {"valid": True, "score": 0.5}, + ) + == "score=+0.2500" + )