Hi, I was wondering if the "changes" and "parent_metrics" context inside evolution history template are bugs.
Description
There's a bug in openevolve/prompt/sampler.py where the changes and parent_metrics fields are being accessed incorrectly from program dictionaries, causing the evolution history to always show "Unknown changes" instead of the actual changes made.
Root Cause
The issue occurs in the _format_evolution_history method (lines 252 and 267) where the code attempts to access metadata fields directly from the program dictionary:
# ❌ INCORRECT - these fields are in metadata, not at top level
changes = program.get("changes", "Unknown changes")
parent_metrics = program.get("parent_metrics", {})
However, when Program objects are created, these fields are stored in the metadata dictionary:
# From iteration.py and process_parallel.py:
result.child_program = Program(
# ... other fields ...
metadata={
"changes": changes_summary, # ← stored in metadata
"parent_metrics": parent.metrics, # ← stored in metadata
},
)
When these Program objects are converted to dictionaries via to_dict() (which uses asdict()), the structure becomes:
{
"id": "...",
"code": "...",
"metrics": {...},
"metadata": {
"changes": "Added loop optimization", # ← actual location
"parent_metrics": {...} # ← actual location
}
# ... other fields
}
Impact
- Evolution history always shows "Unknown changes" instead of actual modifications
- Performance comparison logic fails because
parent_metrics is empty {}
- Users cannot see what changes were made in previous attempts
- This affects the quality of prompts sent to LLMs for evolution
Files Affected
openevolve/openevolve/prompt/sampler.py (lines 252, 267)
Evidence of Correct Pattern
The codebase already shows the correct pattern in _extract_unique_features method (lines 501-503):
# ✅ CORRECT pattern already used elsewhere
metadata = program.get("metadata", {})
if "changes" in metadata:
changes = metadata["changes"]
Related Code Locations
Program creation with metadata:
openevolve/openevolve/iteration.py:130-133
openevolve/openevolve/process_parallel.py:228-232
Program to dict conversion:
openevolve/openevolve/iteration.py:66
openevolve/openevolve/process_parallel.py:157
Correct metadata access pattern:
openevolve/openevolve/prompt/sampler.py:501-503
Hi, I was wondering if the "changes" and "parent_metrics" context inside evolution history template are bugs.
Description
There's a bug in
openevolve/prompt/sampler.pywhere thechangesandparent_metricsfields are being accessed incorrectly from program dictionaries, causing the evolution history to always show "Unknown changes" instead of the actual changes made.Root Cause
The issue occurs in the
_format_evolution_historymethod (lines 252 and 267) where the code attempts to access metadata fields directly from the program dictionary:However, when
Programobjects are created, these fields are stored in themetadatadictionary:When these
Programobjects are converted to dictionaries viato_dict()(which usesasdict()), the structure becomes:{ "id": "...", "code": "...", "metrics": {...}, "metadata": { "changes": "Added loop optimization", # ← actual location "parent_metrics": {...} # ← actual location } # ... other fields }Impact
parent_metricsis empty{}Files Affected
openevolve/openevolve/prompt/sampler.py(lines 252, 267)Evidence of Correct Pattern
The codebase already shows the correct pattern in
_extract_unique_featuresmethod (lines 501-503):Related Code Locations
Program creation with metadata:
openevolve/openevolve/iteration.py:130-133openevolve/openevolve/process_parallel.py:228-232Program to dict conversion:
openevolve/openevolve/iteration.py:66openevolve/openevolve/process_parallel.py:157Correct metadata access pattern:
openevolve/openevolve/prompt/sampler.py:501-503