@@ -3198,6 +3198,30 @@ class LoopConfig:
31983198 #: against a non-sync-eval one** — the noise floors differ, so a
31993199 #: mixed-mode A/B reads the mode change as a spec effect.
32003200 sync_eval : bool = False
3201+ #: Extra dimensions appended to the AOCC battery for *every*
3202+ #: measurement the loop makes — screening, confirm, guard, hold-out.
3203+ #:
3204+ #: The mode presets are frozen contracts, so this composes a widened
3205+ #: battery via :func:`~panobbgo.harness_ioh.with_extra_dims` instead
3206+ #: of editing them. ``(5,)`` on the quick preset turns the nightly's
3207+ #: ``dims=(2,)`` regime into ``dims=(2, 5)``.
3208+ #:
3209+ #: Motivation: the loop samples quick-2-D, but the two sharpest
3210+ #: measured results of 2026-08 both lived at d5 — the JSO d5 add
3211+ #: (2026-08-02) and the NLSHADE_LBC per-dim split (2026-08-11, d2
3212+ #: −0.0241 against d5 +0.0080, both CIs excluding zero). A regime
3213+ #: the loop cannot see is a regime it cannot optimise, and worse, a
3214+ #: change that helps there reads as noise or as a loss in the
3215+ #: aggregate.
3216+ #:
3217+ #: Cost scales super-linearly: ``budget_for`` is
3218+ #: ``budget_multiplier * dim``, so adding dim 5 to the quick battery
3219+ #: doubles the run count *and* the added runs are 2.5x longer.
3220+ #:
3221+ #: Empty (default) leaves every existing invocation byte-identical.
3222+ #: Inert under ``metric="composite"``, which reaches higher dims
3223+ #: through ``--extra-highdim`` / :attr:`extra_families` instead.
3224+ aocc_extra_dims : Tuple [int , ...] = ()
32013225
32023226 def __post_init__ (self ) -> None :
32033227 if self .iterations < 0 :
@@ -3475,6 +3499,17 @@ class LoopIterationRecord:
34753499 #: pooled CI narrower than either mode justifies. Consumers that
34763500 #: aggregate across nights should group by this field.
34773501 sync_eval : bool = False
3502+ #: Dimensions appended to the mode's AOCC battery for this iteration
3503+ #: (:attr:`LoopConfig.aocc_extra_dims`). Empty on legacy records and
3504+ #: on composite runs.
3505+ #:
3506+ #: Recorded for the same reason as :attr:`sync_eval`: widening the
3507+ #: battery moves the *level* of the score, not just its noise —
3508+ #: measured on the quick preset, d2 alone reads 0.3685 while
3509+ #: (d2, d5) reads ~0.31 — so a night before the widening and a night
3510+ #: after are not on one scale. Cross-night consumers must group by
3511+ #: this field as well.
3512+ aocc_extra_dims : Tuple [int , ...] = ()
34783513
34793514 def to_dict (self ) -> Dict [str , Any ]:
34803515 d : Dict [str , Any ] = {
@@ -3502,6 +3537,7 @@ def to_dict(self) -> Dict[str, Any]:
35023537 "bandit_reward" : self .bandit_reward ,
35033538 "confirmed" : self .confirmed ,
35043539 "sync_eval" : self .sync_eval ,
3540+ "aocc_extra_dims" : list (self .aocc_extra_dims ),
35053541 }
35063542 return d
35073543
@@ -4502,6 +4538,7 @@ def _run_internal(
45024538 bandit_reward = bandit_reward ,
45034539 confirmed = confirmed_flag ,
45044540 sync_eval = bool (self .config .sync_eval ),
4541+ aocc_extra_dims = tuple (self .config .aocc_extra_dims ),
45054542 )
45064543 records .append (rec )
45074544 ledger .write (rec )
@@ -4665,6 +4702,7 @@ def _measure_aocc(
46654702 make_quick_battery ,
46664703 make_standard_battery ,
46674704 run_ioh_harness ,
4705+ with_extra_dims ,
46684706 )
46694707
46704708 battery_factories = {
@@ -4673,6 +4711,12 @@ def _measure_aocc(
46734711 "full" : make_full_battery ,
46744712 }
46754713 battery = battery_factories [self .config .mode ]()
4714+ if self .config .aocc_extra_dims :
4715+ # Widen *every* measurement identically — screening,
4716+ # confirm, guard and hold-out all route through here, so
4717+ # the loop can never compare a 2-D baseline against a
4718+ # (2, 5)-D candidate.
4719+ battery = with_extra_dims (battery , self .config .aocc_extra_dims )
46764720 if verbose :
46774721 print (f"[self_improve] iter={ iteration } measuring { label } (AOCC, battery={ battery .name } )" )
46784722 # Mix the iteration into the base seed so each iteration draws
@@ -4718,6 +4762,7 @@ def _skip_record(
47184762 effective_eps_accept = effective_eps_accept ,
47194763 iters_since_accept = iters_since_accept ,
47204764 sync_eval = bool (self .config .sync_eval ),
4765+ aocc_extra_dims = tuple (self .config .aocc_extra_dims ),
47214766 )
47224767
47234768 def _stop_requested (self ) -> bool :
0 commit comments