oncodsl / Read docs /PROMPT_cheap_diversity.md
govindbalki's picture
Upload folder using huggingface_hub
0fff343 verified
|
Raw
History Blame Contribute Delete
3.46 kB
# Prompt β€” cheap diversity knobs (tournament size + mutation + random immigrants), curve as the test
The fitness curve collapses early (best = median by ~gen 10, then flat) β€” premature convergence. Add the cheap diversity levers before considering the island model. Verified against the code. Defaults must preserve current behaviour exactly. `pytest` + `tsc` after.
## Verified current state (engine_v2/gp.py)
`run_gp_v2(..., population_size=150, tournament_k=3, elitism=5, p_mutate=0.7, ...)`. `_tournament_select` (line ~31) picks `k` random contenders and returns the best. Main loop (~121-204): evaluate β†’ rank β†’ carry `elitism` elites β†’ fill the rest via `_tournament_select` Γ—2 + crossover + `mutate`. There is **no** random-immigrant mechanism today.
## Part A β€” add the three levers to `run_gp_v2`
1. **Tournament size** β€” `tournament_k` is already a param. Lowering it (3 β†’ 2) reduces selection pressure β†’ slower takeover β†’ more diversity. Keep the default 3.
2. **Mutation** β€” `p_mutate` is already a param (0.7). Allow raising it (e.g. 0.85). Keep the default 0.7.
3. **Random immigrants (new)** β€” add `immigrant_fraction: float = 0.0`. When > 0, each generation reserve `round(immigrant_fraction * population_size)` slots in the new population for **fresh random programs** drawn from `ramped_population` (same rng/seed, same grammar/objective constraints as init) instead of crossover+mutation offspring. Fill them after the elites, before/among the offspring; never displace the elites. Default 0.0 β‡’ behaviour unchanged.
## Part B β€” one UI toggle to drive them (so you can A/B the curve)
- `RunRequest` gains `diversity: bool = False`. The `_worker` maps `diversity=True` β†’ `tournament_k=2`, `p_mutate=0.85`, `immigrant_fraction=0.10` (tune if needed); `diversity=False` β†’ current defaults unchanged.
- Frontend: a Parameters checkbox **"Maintain diversity"** (default OFF). Tooltip in plain English: "Off: the population can collapse to near-clones early (the fitness curve's best and median lines meet and go flat). On: lowers selection pressure and injects fresh random programs each generation, so the population keeps exploring β€” watch the best-vs-median gap stay open longer."
## Part C β€” the test is the curve
The success criterion is visible in the Live view fitness curve: with **Maintain diversity ON**, the **best and median lines should stay separated for many more generations** (the population doesn't collapse to clones by ~gen 10), versus OFF where they meet early. Also confirm the winner's held-out AUROC doesn't meaningfully drop (diversity should preserve or improve detection, not hurt it). Re-run HPV coherence-on with the toggle off vs on and compare the curves.
## CONSTRAINTS
- Defaults preserve current behaviour byte-for-byte (immigrant_fraction 0, tournament_k 3, p_mutate 0.7) so existing runs are unchanged. No airgap/API-shape break beyond the additive `diversity` field. Airgap untouched (this is search-internal; opaque IDs throughout).
## Checkpoint
- `run_gp_v2` accepts `immigrant_fraction`; with it >0, fresh random programs enter each generation without displacing elites.
- The "Maintain diversity" toggle (default off) flips tournament_k / p_mutate / immigrant_fraction.
- With the toggle ON, the fitness curve's best-vs-median gap visibly persists longer; winner held-out is not degraded.
- `pytest` green (defaults unchanged), `tsc` clean, airgap untouched.