Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions openevolve/utils/format_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
Expand Down Expand Up @@ -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}")
Expand Down
15 changes: 15 additions & 0 deletions tests/test_format_utils.py
Original file line number Diff line number Diff line change
@@ -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"
)
Loading