Skip to content

Commit 6eb0c06

Browse files
committed
fix: Catch case where current_changes_description is None
1 parent e2d089f commit 6eb0c06

File tree

1 file changed

+29
-69
lines changed

1 file changed

+29
-69
lines changed

openevolve/prompt/sampler.py

Lines changed: 29 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -110,17 +110,11 @@ def build_prompt(
110110

111111
if self.config.programs_as_changes_description:
112112
if self.config.system_message_changes_description:
113-
system_message_changes_description = (
114-
self.config.system_message_changes_description.strip()
115-
)
113+
system_message_changes_description = self.config.system_message_changes_description.strip()
116114
else:
117-
system_message_changes_description = self.template_manager.get_template(
118-
"system_message_changes_description"
119-
)
115+
system_message_changes_description = self.template_manager.get_template("system_message_changes_description")
120116

121-
system_message = self.template_manager.get_template(
122-
"system_message_with_changes_description"
123-
).format(
117+
system_message = self.template_manager.get_template("system_message_with_changes_description").format(
124118
system_message=system_message,
125119
system_message_changes_description=system_message_changes_description,
126120
)
@@ -167,9 +161,7 @@ def build_prompt(
167161
)
168162

169163
if self.config.programs_as_changes_description and current_changes_description is not None:
170-
user_message = self.template_manager.get_template(
171-
"user_message_with_changes_description"
172-
).format(
164+
user_message = self.template_manager.get_template("user_message_with_changes_description").format(
173165
user_message=user_message,
174166
changes_description=current_changes_description.rstrip(),
175167
)
@@ -273,8 +265,11 @@ def _format_evolution_history(
273265

274266
for i, program in enumerate(reversed(selected_previous)):
275267
attempt_number = len(previous_programs) - i
276-
changes = program.get("changes_description") or program.get("metadata", {}).get(
277-
"changes", self.template_manager.get_fragment("attempt_unknown_changes")
268+
changes = (
269+
program.get("changes_description")
270+
or program.get("metadata", {}).get(
271+
"changes", self.template_manager.get_fragment("attempt_unknown_changes")
272+
)
278273
)
279274

280275
# Format performance metrics using safe formatting
@@ -339,7 +334,9 @@ def _format_evolution_history(
339334
for i, program in enumerate(selected_top):
340335
use_changes = self.config.programs_as_changes_description
341336
program_code = (
342-
program.get("changes_description", "") if use_changes else program.get("code", "")
337+
program.get("changes_description", "")
338+
if use_changes
339+
else program.get("code", "")
343340
)
344341
if not program_code:
345342
program_code = "<missing changes_description>" if use_changes else ""
@@ -354,20 +351,11 @@ def _format_evolution_history(
354351
for name, value in program.get("metrics", {}).items():
355352
if isinstance(value, (int, float)):
356353
try:
357-
key_features.append(
358-
self.template_manager.get_fragment("top_program_metrics_prefix")
359-
+ f" {name} ({value:.4f})"
360-
)
354+
key_features.append(self.template_manager.get_fragment("top_program_metrics_prefix") + f" {name} ({value:.4f})")
361355
except (ValueError, TypeError):
362-
key_features.append(
363-
self.template_manager.get_fragment("top_program_metrics_prefix")
364-
+ f" {name} ({value})"
365-
)
356+
key_features.append(self.template_manager.get_fragment("top_program_metrics_prefix") + f" {name} ({value})")
366357
else:
367-
key_features.append(
368-
self.template_manager.get_fragment("top_program_metrics_prefix")
369-
+ f" {name} ({value})"
370-
)
358+
key_features.append(self.template_manager.get_fragment("top_program_metrics_prefix") + f" {name} ({value})")
371359

372360
key_features_str = ", ".join(key_features)
373361

@@ -397,11 +385,7 @@ def _format_evolution_history(
397385
# Use random sampling to get diverse programs
398386
diverse_programs = random.sample(remaining_programs, num_diverse)
399387

400-
diverse_programs_str += (
401-
"\n\n## "
402-
+ self.template_manager.get_fragment("diverse_programs_title")
403-
+ "\n\n"
404-
)
388+
diverse_programs_str += "\n\n## " + self.template_manager.get_fragment("diverse_programs_title") + "\n\n"
405389

406390
for i, program in enumerate(diverse_programs):
407391
use_changes = self.config.programs_as_changes_description
@@ -420,8 +404,7 @@ def _format_evolution_history(
420404
key_features = program.get("key_features", [])
421405
if not key_features:
422406
key_features = [
423-
self.template_manager.get_fragment("diverse_program_metrics_prefix")
424-
+ f" {name}"
407+
self.template_manager.get_fragment("diverse_program_metrics_prefix") + f" {name}"
425408
for name in list(program.get("metrics", {}).keys())[
426409
:2
427410
] # Just first 2 metrics
@@ -433,9 +416,7 @@ def _format_evolution_history(
433416
top_program_template.format(
434417
program_number=f"D{i + 1}",
435418
score=f"{score:.4f}",
436-
language=(
437-
"text" if self.config.programs_as_changes_description else language
438-
),
419+
language=("text" if self.config.programs_as_changes_description else language),
439420
program_snippet=program_code,
440421
key_features=key_features_str,
441422
)
@@ -485,7 +466,9 @@ def _format_inspirations_section(
485466
for i, program in enumerate(inspirations):
486467
use_changes = self.config.programs_as_changes_description
487468
program_code = (
488-
program.get("changes_description", "") if use_changes else program.get("code", "")
469+
program.get("changes_description", "")
470+
if use_changes
471+
else program.get("code", "")
489472
)
490473
if not program_code:
491474
program_code = "<missing changes_description>" if use_changes else ""
@@ -568,24 +551,16 @@ def _extract_unique_features(self, program: Dict[str, Any]) -> str:
568551
and self.config.include_changes_under_chars
569552
and len(changes) < self.config.include_changes_under_chars
570553
):
571-
features.append(
572-
self.template_manager.get_fragment("inspiration_changes_prefix").format(
573-
changes=changes
574-
)
575-
)
554+
features.append(self.template_manager.get_fragment("inspiration_changes_prefix").format(changes=changes))
576555

577556
# Analyze metrics for standout characteristics
578557
metrics = program.get("metrics", {})
579558
for metric_name, value in metrics.items():
580559
if isinstance(value, (int, float)):
581560
if value >= 0.9:
582-
features.append(
583-
f"{self.template_manager.get_fragment('inspiration_metrics_excellent').format(metric_name=metric_name, value=value)}"
584-
)
561+
features.append(f"{self.template_manager.get_fragment('inspiration_metrics_excellent').format(metric_name=metric_name, value=value)}")
585562
elif value <= 0.3:
586-
features.append(
587-
f"{self.template_manager.get_fragment('inspiration_metrics_alternative').format(metric_name=metric_name)}"
588-
)
563+
features.append(f"{self.template_manager.get_fragment('inspiration_metrics_alternative').format(metric_name=metric_name)}")
589564

590565
# Code-based features (simple heuristics)
591566
code = program.get("code", "")
@@ -596,32 +571,22 @@ def _extract_unique_features(self, program: Dict[str, Any]) -> str:
596571
if "numpy" in code_lower or "np." in code_lower:
597572
features.append(self.template_manager.get_fragment("inspiration_code_with_numpy"))
598573
if "for" in code_lower and "while" in code_lower:
599-
features.append(
600-
self.template_manager.get_fragment("inspiration_code_with_mixed_iteration")
601-
)
574+
features.append(self.template_manager.get_fragment("inspiration_code_with_mixed_iteration"))
602575
if (
603576
self.config.concise_implementation_max_lines
604577
and len(code.split("\n")) <= self.config.concise_implementation_max_lines
605578
):
606-
features.append(
607-
self.template_manager.get_fragment("inspiration_code_with_concise_line")
608-
)
579+
features.append(self.template_manager.get_fragment("inspiration_code_with_concise_line"))
609580
elif (
610581
self.config.comprehensive_implementation_min_lines
611582
and len(code.split("\n")) >= self.config.comprehensive_implementation_min_lines
612583
):
613-
features.append(
614-
self.template_manager.get_fragment("inspiration_code_with_comprehensive_line")
615-
)
584+
features.append(self.template_manager.get_fragment("inspiration_code_with_comprehensive_line"))
616585

617586
# Default if no specific features found
618587
if not features:
619588
program_type = self._determine_program_type(program)
620-
features.append(
621-
self.template_manager.get_fragment("inspiration_no_features_postfix").format(
622-
program_type=program_type
623-
)
624-
)
589+
features.append(self.template_manager.get_fragment("inspiration_no_features_postfix").format(program_type=program_type))
625590

626591
# Use num_top_programs as limit for features (similar to how we limit programs)
627592
feature_limit = self.config.num_top_programs
@@ -664,12 +629,7 @@ def _render_artifacts(self, artifacts: Dict[str, Union[str, bytes]]) -> str:
664629
sections.append(f"### {key}\n```\n{content}\n```")
665630

666631
if sections:
667-
return (
668-
"## "
669-
+ self.template_manager.get_fragment("artifact_title")
670-
+ "\n\n"
671-
+ "\n\n".join(sections)
672-
)
632+
return "## " + self.template_manager.get_fragment("artifact_title") + "\n\n" + "\n\n".join(sections)
673633
else:
674634
return ""
675635

0 commit comments

Comments
 (0)