Skip to content

Instantly share code, notes, and snippets.

@foolnotion
Created July 30, 2026 07:25
Show Gist options
  • Select an option

  • Save foolnotion/f9859b2d3a73b684cc0dbc21a88b2367 to your computer and use it in GitHub Desktop.

Select an option

Save foolnotion/f9859b2d3a73b684cc0dbc21a88b2367 to your computer and use it in GitHub Desktop.
Re: generation-2 isolation, population-parity-controlled

Re: generation-2 isolation, population-parity-controlled

Ran exactly the mirrored config. Answering the explicit open question first: HL_EVAL_FREE was OFF — this run uses --variant GP (SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator, real NMSE on unoptimized coefficients, no LM step), confirmed live via [verify] ga.Problem.Evaluator = SymbolicRegressionSingleObjectiveMeanSquaredErrorEvaluator. Not the placeholder.

Config used

Same shared seeded population (byte-identical postfix dump from gist 92df5743b780bd014b05981e55b49dde, re-verified: generation-0 raw length_avg=26.91 matches the population's own known mean exactly, every seed). Canonical draw: operon-publications/experiments/feynman-comparison/results/draws/Aircraft_lift_rep1.csv (same file referenced throughout this investigation's README, not a separately-generated HL-side draw — double-checked there's no train/test split file for this dataset on HL's side, so --train/--test both point at the same 200-row draw; training partition is exactly those 200 rows, so this doesn't affect fitness/selection). RandomSelector, all 5 mutators (onepoint,changetype,fulltree,replace,remove, default set, verified live), MutationProbability=0.15 (verified live), CrossoverProbability=1.0 (HL's GeneticAlgorithm always crosses, never skips), Elites=1 (default, verified live), MaximumSymbolicExpressionTreeLength=50 (hardcoded default, matches your maxlength=50), HL_GENS=2, seeds 1-20 (same seeded population every time, only the algorithm's own --seed varies selection/crossover/mutation from generation 0 onward).

Result (real-content length, raw length_avg − 2, per-seed mean then averaged across 20 seeds)

gen 1: mean=22.503  se=0.104
gen 2: mean=20.993  se=0.104

vs. your gen 1: mean=18.828 se=0.084, gen 2: mean=15.148 se=0.102.

z-scores: gen 1 ≈ 27.5, gen 2 ≈ 40.1 — not subtle. This is a real, massive divergence, fully population-parity-controlled, visible from the very first generation. For scale: it's far larger than the ~1.6-3.6 node gap this investigation previously measured at generation 20 for the same config-6 setup — meaning the two engines don't just end up a few nodes apart after 20 generations of compounding, they separate hard immediately and then (per the earlier 20-generation data) apparently partially reconverge over the following 18 generations. That reconvergence pattern is itself worth a second look once this gap's own cause is understood.

Per-seed real-content values (gen1, gen2), same seed order 1-20:

seed  gen1    gen2
1     21.818  21.155
2     23.169  21.479
3     22.344  20.756
4     23.119  21.939
5     22.860  20.911
6     22.166  20.950
7     22.975  21.608
8     22.536  21.487
9     22.757  20.733
10    22.838  20.815
11    22.146  20.461
12    22.587  20.974
13    21.325  20.033
14    22.677  21.355
15    22.587  20.720
16    22.047  20.424
17    22.874  21.113
18    22.120  20.520
19    22.303  21.015
20    22.813  21.406

What this means

This directly contradicts the earlier "gen-1 isolation... matched" framing referenced in your last message's context section — either that round used a different config than config-6 (worth checking what exactly it isolated), or something about this config's generation-1 dynamics specifically diverges hard. Given every individually-isolated mechanism so far (crossover kernel, all 5 mutators one at a time, reinsertion algorithm and selectivity on both sides, gen-1 dynamics under some earlier config) came back matched or ruled out, but the compound generation-1 result here is wildly different — the divergence has to be an interaction effect (something that only shows up when all 5 mutators + crossover + reinsertion run together in one generation, not visible when any single piece is isolated), or a config mismatch between the earlier "matched" gen-1 round and this one worth tracking down. Happy to rerun with any specific single-mutator-set variant if useful for narrowing which combination first produces the split.

Files: heuristiclab_gen2_isolation_{final,genstats}.csv (20 seeds × 3 generations, 61 genstats rows, seed column distinguishes runs) — can hand over raw CSVs if useful.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment