Skip to content
Merged
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
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ black openevolve tests examples

## Pull Request Process

1. Create a new branch for your feature or bugfix: `git checkout -b feature/your-feature-name`
1. Create a new branch for your feature or bugfix: `git checkout -b feat-your-feature-name`
2. Make your changes
3. Add tests for your changes
4. Run the tests to make sure everything passes: `python -m unittest discover tests`
Expand Down
73 changes: 73 additions & 0 deletions configs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# OpenEvolve Configuration Files

This directory contains configuration files for OpenEvolve with examples for different use cases.

## Configuration Files

### `default_config.yaml`
The main configuration file containing all available options with sensible defaults. This file includes:
- Complete documentation for all configuration parameters
- Default values for all settings
- **Island-based evolution parameters** for proper evolutionary diversity

Use this file as a template for your own configurations.

### `island_config_example.yaml`
A practical example configuration demonstrating proper island-based evolution setup. Shows:
- Recommended island settings for most use cases
- Balanced migration parameters
- Complete working configuration

### `island_examples.yaml`
Multiple example configurations for different scenarios:
- **Maximum Diversity**: Many islands, frequent migration
- **Focused Exploration**: Few islands, rare migration
- **Balanced Approach**: Default recommended settings
- **Quick Exploration**: Small-scale rapid testing
- **Large-Scale Evolution**: Complex optimization runs

Includes guidelines for choosing parameters based on your problem characteristics.

## Island-Based Evolution Parameters

The key new parameters for proper evolutionary diversity are:

```yaml
database:
num_islands: 5 # Number of separate populations
migration_interval: 50 # Migrate every N generations
migration_rate: 0.1 # Fraction of top programs to migrate
```

### Parameter Guidelines

- **num_islands**: 3-10 for most problems (more = more diversity)
- **migration_interval**: 25-100 generations (higher = more independence)
- **migration_rate**: 0.05-0.2 (5%-20%, higher = faster knowledge sharing)

### When to Use What

- **Complex problems** → More islands, less frequent migration
- **Simple problems** → Fewer islands, more frequent migration
- **Long runs** → More islands to maintain diversity
- **Short runs** → Fewer islands for faster convergence

## Usage

Copy any of these files as a starting point for your configuration:

```bash
cp configs/default_config.yaml my_config.yaml
# Edit my_config.yaml for your specific needs
```

Then use with OpenEvolve:

```python
from openevolve import OpenEvolve
evolve = OpenEvolve(
initial_program_path="program.py",
evaluation_file="evaluator.py",
config_path="my_config.yaml"
)
```
20 changes: 11 additions & 9 deletions configs/default_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,7 @@ prompt:
- "I suggest the following improvements:"
- "We can enhance this code by:"

# Meta-prompting (experimental)
use_meta_prompting: false # Use LLM to generate parts of the prompt
meta_prompt_weight: 0.1 # Weight for meta-prompting influence
# Note: meta-prompting features are not yet implemented

# Database configuration
database:
Expand All @@ -68,13 +66,19 @@ database:
# Evolutionary parameters
population_size: 1000 # Maximum number of programs to keep in memory
archive_size: 100 # Size of elite archive
num_islands: 5 # Number of islands for island model
num_islands: 5 # Number of islands for island model (separate populations)

# Island-based evolution parameters
# Islands provide diversity by maintaining separate populations that evolve independently.
# Migration periodically shares the best solutions between adjacent islands.
migration_interval: 50 # Migrate between islands every N generations
migration_rate: 0.1 # Fraction of top programs to migrate (0.1 = 10%)

# Selection parameters
elite_selection_ratio: 0.1 # Ratio of elite programs to select
exploration_ratio: 0.2 # Ratio of exploration vs exploitation
exploitation_ratio: 0.7 # Ratio of exploitation vs random selection
diversity_metric: "edit_distance" # Diversity metric (edit_distance, feature_based)
# Note: diversity_metric is fixed to "edit_distance" (feature_based not implemented)

# Feature map dimensions for MAP-Elites
feature_dimensions: # Dimensions for MAP-Elites feature map
Expand All @@ -88,9 +92,7 @@ evaluator:
timeout: 300 # Maximum evaluation time in seconds
max_retries: 3 # Maximum number of retries for evaluation

# Resource limits
memory_limit_mb: null # Memory limit for evaluation (null = no limit)
cpu_limit: null # CPU limit for evaluation (null = no limit)
# Note: resource limits (memory_limit_mb, cpu_limit) are not yet implemented

# Evaluation strategies
cascade_evaluation: true # Use cascade evaluation to filter bad solutions early
Expand All @@ -101,7 +103,7 @@ evaluator:

# Parallel evaluation
parallel_evaluations: 4 # Number of parallel evaluations
distributed: false # Use distributed evaluation
# Note: distributed evaluation is not yet implemented

# LLM-based feedback (experimental)
use_llm_feedback: false # Use LLM to evaluate code quality
Expand Down
55 changes: 55 additions & 0 deletions configs/island_config_example.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# OpenEvolve Island-Based Evolution Configuration
# This configuration demonstrates the proper use of island-based evolution

# General settings
max_iterations: 1000
checkpoint_interval: 100
log_level: "INFO"

# LLM configuration
llm:
primary_model: "gemini-2.0-flash-lite"
primary_model_weight: 0.8
secondary_model: "gemini-2.0-flash"
secondary_model_weight: 0.2
temperature: 0.7
top_p: 0.95
max_tokens: 4096

# Database configuration with proper island settings
database:
population_size: 500
archive_size: 100

# Island-based evolution settings
num_islands: 5 # Number of separate populations
migration_interval: 50 # Migrate every 50 generations
migration_rate: 0.1 # Migrate 10% of top programs

# Selection parameters
elite_selection_ratio: 0.1
exploration_ratio: 0.3
exploitation_ratio: 0.7
# Note: diversity_metric fixed to "edit_distance"

# Feature map dimensions for MAP-Elites
feature_dimensions: ["score", "complexity"]
feature_bins: 10

# Prompt configuration
prompt:
num_top_programs: 3
num_diverse_programs: 2
use_template_stochasticity: true

# Evaluator configuration
evaluator:
timeout: 300
max_retries: 3
cascade_evaluation: true
parallel_evaluations: 4

# Evolution settings
diff_based_evolution: true
allow_full_rewrites: false
max_code_length: 10000
80 changes: 80 additions & 0 deletions configs/island_examples.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# OpenEvolve Island-Based Evolution Configuration Examples
# Different configurations for various use cases

# Configuration for Maximum Diversity (Many Islands, Frequent Migration)
# Use this when you want to explore the search space thoroughly
# Good for: Complex problems, avoiding local optima, long runs
max_diversity:
database:
num_islands: 10 # More islands = more diversity
migration_interval: 25 # More frequent migration
migration_rate: 0.2 # Higher migration rate
population_size: 1000
archive_size: 200

# Configuration for Focused Exploration (Few Islands, Rare Migration)
# Use this when you want deeper exploration within each island
# Good for: Problems with clear structure, shorter runs
focused_exploration:
database:
num_islands: 3 # Fewer islands = deeper exploration
migration_interval: 100 # Less frequent migration
migration_rate: 0.05 # Lower migration rate
population_size: 500
archive_size: 50

# Configuration for Balanced Approach (Default Settings)
# Use this as a starting point for most problems
# Good for: General use, medium-length runs
balanced:
database:
num_islands: 5 # Balanced number of islands
migration_interval: 50 # Moderate migration frequency
migration_rate: 0.1 # Moderate migration rate
population_size: 1000
archive_size: 100

# Configuration for Quick Exploration (Small Scale)
# Use this for rapid prototyping and testing
# Good for: Small problems, quick experiments
quick_exploration:
database:
num_islands: 3
migration_interval: 20
migration_rate: 0.15
population_size: 200
archive_size: 30

# Configuration for Large-Scale Evolution (High Performance)
# Use this for complex problems requiring extensive search
# Good for: Complex optimization, long evolutionary runs
large_scale:
database:
num_islands: 15 # Many islands for parallel exploration
migration_interval: 75 # Balanced migration timing
migration_rate: 0.08 # Conservative migration rate
population_size: 2000 # Large populations
archive_size: 300

# Guidelines for choosing parameters:
#
# num_islands:
# - More islands = more diversity, slower convergence
# - Fewer islands = faster convergence, risk of premature convergence
# - Recommended: 3-10 for most problems
#
# migration_interval:
# - Lower values = more frequent knowledge sharing
# - Higher values = more independent evolution
# - Recommended: 25-100 generations
#
# migration_rate:
# - Higher values = faster knowledge propagation
# - Lower values = preserve island diversity longer
# - Recommended: 0.05-0.2 (5%-20%)
#
# Rule of thumb:
# - Complex problems → More islands, less frequent migration
# - Simple problems → Fewer islands, more frequent migration
# - Long runs → More islands to maintain diversity
# - Short runs → Fewer islands for faster convergence
26 changes: 20 additions & 6 deletions openevolve/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,13 @@ class DatabaseConfig:
feature_dimensions: List[str] = field(default_factory=lambda: ["score", "complexity"])
feature_bins: int = 10

# Migration parameters for island-based evolution
migration_interval: int = 50 # Migrate every N generations
migration_rate: float = 0.1 # Fraction of population to migrate

# Random seed for reproducible sampling
random_seed: Optional[int] = None


@dataclass
class EvaluatorConfig:
Expand Down Expand Up @@ -188,8 +195,9 @@ def to_dict(self) -> Dict[str, Any]:
"num_diverse_programs": self.prompt.num_diverse_programs,
"use_template_stochasticity": self.prompt.use_template_stochasticity,
"template_variations": self.prompt.template_variations,
"use_meta_prompting": self.prompt.use_meta_prompting,
"meta_prompt_weight": self.prompt.meta_prompt_weight,
# Note: meta-prompting features not implemented
# "use_meta_prompting": self.prompt.use_meta_prompting,
# "meta_prompt_weight": self.prompt.meta_prompt_weight,
},
"database": {
"db_path": self.database.db_path,
Expand All @@ -200,19 +208,25 @@ def to_dict(self) -> Dict[str, Any]:
"elite_selection_ratio": self.database.elite_selection_ratio,
"exploration_ratio": self.database.exploration_ratio,
"exploitation_ratio": self.database.exploitation_ratio,
"diversity_metric": self.database.diversity_metric,
# Note: diversity_metric fixed to "edit_distance"
# "diversity_metric": self.database.diversity_metric,
"feature_dimensions": self.database.feature_dimensions,
"feature_bins": self.database.feature_bins,
"migration_interval": self.database.migration_interval,
"migration_rate": self.database.migration_rate,
"random_seed": self.database.random_seed,
},
"evaluator": {
"timeout": self.evaluator.timeout,
"max_retries": self.evaluator.max_retries,
"memory_limit_mb": self.evaluator.memory_limit_mb,
"cpu_limit": self.evaluator.cpu_limit,
# Note: resource limits not implemented
# "memory_limit_mb": self.evaluator.memory_limit_mb,
# "cpu_limit": self.evaluator.cpu_limit,
"cascade_evaluation": self.evaluator.cascade_evaluation,
"cascade_thresholds": self.evaluator.cascade_thresholds,
"parallel_evaluations": self.evaluator.parallel_evaluations,
"distributed": self.evaluator.distributed,
# Note: distributed evaluation not implemented
# "distributed": self.evaluator.distributed,
"use_llm_feedback": self.evaluator.use_llm_feedback,
"llm_feedback_weight": self.evaluator.llm_feedback_weight,
},
Expand Down
Loading