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.
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).
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
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.