homemaker-layout/experiments
Claude a76ed3b9b8
Quality aggregation: divide out how many questions a leaf was asked
39.17 left the search's storey choice unexplained and blamed value_rate. It is
not the rate, or not only.

Measured over the twelve baseline runs, value/cost by leaf kind: outside ground
7.40, roof terrace 2.69, room 0.34, circulation 0.02. A terrace returns 2.7x
its cost where a room returns a third of it, so filling upper storeys with
terrace is not the search leaving value on the table -- it is by a wide margin
the most profitable thing the objective offers. 7% of the corpus area produces
32% of its value.

Most of that gap is mean quality: 0.986 for a terrace against 0.223 for a
room. Quality is a PRODUCT of factors and the kinds are not asked the same
number of questions -- an outside leaf is exempt from size, crinkliness and
access, so 3 of 7 factors can ever bite it against a room's 6. Each exemption
is individually right (no programme size target; uncovered outside is lit by
definition; ground-level outside needs no access). The consequence is not: a
leaf exempt from the two harshest factors out-scores one judged on them and
doing well, purely by not being asked, and quality multiplies the value rate.

Stated generally, and this is not about outside space: under a product, adding
any new quality criterion mechanically devalues every leaf it applies to,
including leaves that score 1.0 on it. The objective's scale should not depend
on how many things it measures.

quality_aggregate="geometric_mean" (default OFF, "product" is stock) divides
that out. Computed in log space so six small factors cannot underflow the
product before the root is taken; a zero factor still gives zero, so a fully
buried leaf is worth nothing either way.

Telling "exempt" from "asked and scored 1.0" needs factor_is_asked, which
restates conditions that live inside the quality_* methods. That duplication
can drift, so tests/test_fitness_aggregate.py pins it against every leaf in the
corpus: wherever the predicate says exempt, the factor really is 1.0.

Fail set byte-identical everywhere, and for a stronger reason than 39.13/39.14
had: evaluate_leaf emits each fail from the factor itself before anything is
combined, so no aggregation can move one. Score effect +37% to +169%, reaching
all four programmes where the crinkliness changes reached two; room value/cost
0.34 -> 0.66, circulation 0.02 -> 0.07.

Deliberately not fixed: a terrace still out-earns a room 4:1, which is the
rates (value_supported = value_inside = 300 against costs of 110 and 200), not
the aggregation. That is a design judgement for the programme author, and
39.16 is a standing reminder that "this inherited constant looks wrong" has
been wrong twice already in this section. Left open on ecx with the numbers.

A/B running; verdict to follow.

Refs homemaker-py-ecx.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 18:57:00 +00:00
..
results Record what the crinkliness examination found: 39.13, 39.14, 39.15 2026-09-05 15:11:11 +00:00
ab_9gj_crinkliness.py Quality aggregation: divide out how many questions a leaf was asked 2026-09-05 18:57:00 +00:00
ab_cpsat_assign.py homemaker-py-2g7.5: CP-SAT exact room-code assignment (seeder + reassign op) 2026-08-04 09:19:36 +01:00
ab_crinkliness_mode_ssz.py ssz: crinkliness is declared per space; there is no daylight attribute 2026-08-28 22:39:09 +00:00
ab_report.py A/Bs now report what their sample could resolve 2026-08-29 19:51:47 +00:00
ab_shapecurve_prune.py homemaker-py-wkh: DP-exact hard pre-filter for driver.py's shape-feasibility prune 2026-08-03 21:10:28 +01:00
ab_shapecurve_warmstart.py homemaker-py-6xh: wire shape-curve DP into driver.py as an NM warm-start 2026-08-03 18:43:28 +01:00
ab_ssz_search.py A/Bs now report what their sample could resolve 2026-08-29 19:51:47 +00:00
accept_innerloop.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
audit_crinkliness_truth.py Owner's daylight ruling: corridors need it; retract the 61% headline 2026-08-28 23:14:21 +00:00
audit_programme_config.py Audit: ask whether a room spec is feasible AS DECLARED, not merely somewhere 2026-09-05 07:46:43 +00:00
autodiff_spike.py Spike: torch-autodiff inner-loop ratio optimisation (homemaker-py-2ax) — negative 2026-08-01 10:26:43 +01:00
bakeoff_harbor.json Swap inner loop default from CMA-ES to Nelder-Mead (homemaker-py-d6d) 2026-06-14 08:51:22 +01:00
bakeoff_harbor.py Swap inner loop default from CMA-ES to Nelder-Mead (homemaker-py-d6d) 2026-06-14 08:51:22 +01:00
bakeoff_innerloop.json Bake-off: CMA-ES confirmed as inner-loop optimiser (homemaker-py-d0s) 2026-06-13 09:47:15 +01:00
bakeoff_innerloop.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
bakeoff_native.json Swap inner loop default from CMA-ES to Nelder-Mead (homemaker-py-d6d) 2026-06-14 08:51:22 +01:00
bakeoff_native.py Swap inner loop default from CMA-ES to Nelder-Mead (homemaker-py-d6d) 2026-06-14 08:51:22 +01:00
bench_batch_oracle.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
benchmark_vs_urbevolve.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
diag_2f45907.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
diag_connectivity_yql.py §39.9: level-not-connected is destroyed by the resize, not by the search 2026-08-26 14:39:07 +00:00
diag_depth_balance.py x3b/§13.10: productionise leaf-sharing — per-code share grain + CLI wiring 2026-06-28 22:04:35 +01:00
diag_edge_too_long.py x3b/§13.10: productionise leaf-sharing — per-code share grain + CLI wiring 2026-06-28 22:04:35 +01:00
diag_exposure_frontage.py Frontage feasibility as a pre-flight check; retract the "3x short" claim 2026-08-26 16:20:52 +00:00
diag_leaf_shapefail.py erc.1: Diagnostic A — per-leaf shape-fail vs density (§13.1) 2026-06-23 22:06:04 +01:00
diag_leaf_sharing.py x3b/§13.10: productionise leaf-sharing — per-code share grain + CLI wiring 2026-06-28 22:04:35 +01:00
diag_residual_91f.py homemaker-py-91f: residual diagnostic on the current full default stack 2026-08-01 19:38:46 +01:00
diag_slack_localization.py erc.2: Diagnostic B — undersize-despite-slack localization (§13.2) 2026-06-23 22:47:34 +01:00
dump_areas.pl Scaffold homemaker-py with validated geometry port 2026-06-10 20:50:20 +01:00
dump_areas.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
dump_leaf_quality.pl Native fitness: leaf quality terms + cost model (homemaker-py-gnw) 2026-06-13 07:59:21 +01:00
genome_parity.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
leaf_parity.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
measure_seed_geometry.py Phase 7 §12.2: proportion-aware constructive seeding + storey_minimum fix (leu.2, cq1) 2026-06-20 14:04:42 +01:00
migrate_crinkliness_key.py ssz: crinkliness is declared per space; there is no daylight attribute 2026-08-28 22:39:09 +00:00
migrate_usage_key.py §39.7: access requirements become a declared usage: attribute (homemaker-py-sel) 2026-08-26 13:39:41 +00:00
operator_locality.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
optimize_fullfitness.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
penalty_reshape.json Lexicographic outer-search comparison, preserve inner-loop cliff (homemaker-py-yg5) 2026-06-14 09:20:03 +01:00
penalty_reshape.py Lexicographic outer-search comparison, preserve inner-loop cliff (homemaker-py-yg5) 2026-06-14 09:20:03 +01:00
probe_harbor_floor.py Staged harness re-scored under a different objective than it searched 2026-08-29 12:11:38 +00:00
rebaseline_no_occlusion.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
refine_sweep.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
rerun_1ph_protocol.sh Harbor A/Bs at n=3 could never resolve their own margins 2026-08-29 19:34:30 +00:00
resolve_ratios.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
run_1s3_confirm.sh homemaker-py-1s3: multi-use leaves N=15 confirmation -- does not replicate 2026-08-01 08:52:24 +01:00
run_1s3_confirm_staged.sh homemaker-py-1s3: multi-use leaves N=15 confirmation -- does not replicate 2026-08-01 08:52:24 +01:00
run_6zy_ab.sh 6zy/§11.8: co-tune topology diversity × tournament pressure — null robust 2026-06-29 22:56:23 +01:00
run_8sh_ab.sh 8sh: insert/relocate-circulation repair operator (qi6 mechanism (a)) 2026-07-24 19:48:13 +01:00
run_9gp_ab.sh Phase 7 §12.3: 9gp A/B measured — NEGATIVE; close 9gp + epic leu 2026-06-21 07:21:51 +01:00
run_9yx_sweep.sh homemaker-py-9yx: health-centre — non-synthetic third example programme 2026-07-30 00:09:37 +01:00
run_and_capture_91f.py homemaker-py-91f: residual diagnostic on the current full default stack 2026-08-01 19:38:46 +01:00
run_c3g_ab.sh c3g: circ-per-room granularity knob (circ_divisor) + A/B harness 2026-06-21 21:10:18 +01:00
run_coldstart_baseline.py coldstart runner: commit only its own artefacts, not the whole tree 2026-08-29 19:40:00 +00:00
run_depthbal_ab.sh erc.4: depth-balanced construction mechanism + floor probe (§13.4) 2026-06-25 22:36:24 +01:00
run_e01_sweep.py e01: harbor-house beam-width larger-N confirmation (null) 2026-07-29 00:22:55 +01:00
run_f1d_ab.sh f1d: ruin-and-recreate LNS operator, validated positive on programme-house 2026-07-26 09:31:42 +01:00
run_f1d_larger_n.sh f1d: ruin-and-recreate LNS operator, validated positive on programme-house 2026-07-26 09:31:42 +01:00
run_f1d_w3_ab.sh f1d: ruin-and-recreate LNS operator, validated positive on programme-house 2026-07-26 09:31:42 +01:00
run_interioro_ab.sh erc/ld2: interior-O light-well seeding — §13.6 positive on dense floors 2026-06-28 07:20:20 +01:00
run_island_ab.py psk/§14: island model — null (best-of-N at equal budget wins) 2026-06-29 06:20:29 +01:00
run_leafshare_ab.sh erc.3: explicit per-leaf multiplicity closes the leak; driver A/B wired (§13.3) 2026-06-24 18:16:17 +01:00
run_leu2_ab.sh Phase 7 §12.2: proportion-aware constructive seeding + storey_minimum fix (leu.2, cq1) 2026-06-20 14:04:42 +01:00
run_lj3_qjg_ab.sh lj3/qjg: larger-N + weight sweep finds bridge_circulation effect is noise 2026-07-25 12:20:22 +01:00
run_multiuse_ab.sh homemaker-py-1s3: multi-use leaves as permanent design goal (§26 path b) 2026-07-31 00:16:12 +01:00
run_qi6_ab.sh qi6: full-budget A/B for graded circulation-connectivity signal, negative result 2026-07-23 18:29:45 +01:00
run_search.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
run_search_scaled.py 6zy/§11.8: co-tune topology diversity × tournament pressure — null robust 2026-06-29 22:56:23 +01:00
run_shareedge_ab.sh hph/§13.8: share-aware edge-too-long cap — shared leaves no longer penalised for aggregate wall length 2026-06-28 21:24:51 +01:00
run_sharefactor_sweep.sh erc.7: leaf-sharing × depth-balancing synergy CONFIRMED end-to-end (§13.5) 2026-06-26 16:47:14 +01:00
run_staged_search.py Staged harness re-scored under a different objective than it searched 2026-08-29 12:11:38 +00:00
run_synergy_ab.sh erc.7: leaf-sharing × depth-balancing synergy CONFIRMED end-to-end (§13.5) 2026-06-26 16:47:14 +01:00
run_xyu_sweep.sh xyu: n=18 ruin_recreate N=15 confirmation — weakened, not resolved 2026-07-29 10:10:23 +01:00
run_y51_sweep.sh y51: synthetic room-count sweep finds no clean ruin_recreate size threshold 2026-07-26 15:35:03 +01:00
run_y51_sweep_ln.sh y51: synthetic room-count sweep finds no clean ruin_recreate size threshold 2026-07-26 15:35:03 +01:00
shapecurve_spike.py homemaker-py-2g7.4: fix shape-curve DP to be rotation-invariant 2026-08-03 07:06:48 +01:00
sweep_failtypes.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
tier_ab_2g7_3.py homemaker-py-2g7.3: hard/soft fail tiering behind --use-tiers flag 2026-08-02 16:00:39 +01:00
usage_map_proposal.yaml homemaker-py-sel: usage is a plain space attribute — drop the mapping table 2026-08-26 12:56:12 +00:00
validate_shapecurve.py homemaker-py-wkh: DP-exact hard pre-filter for driver.py's shape-feasibility prune 2026-08-03 21:10:28 +01:00
validate_shapecurve_multistorey.py homemaker-py-koo: multi-storey (below-link) support for the shape-curve DP 2026-08-03 23:30:18 +01:00
warm_vs_cold.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00