47c4f40f4d
Two related fixes. 1) Formula strings show B alongside every other symbol. Previously the numeric FLOPs/mem_bytes/comm_bytes were scaled by B, but the printed formula strings still read like B=1 amounts. That made the per-stage table confusing at high B: numbers moved but formulas didn't. Updated every attention + FFN stage's `formula` / `flops_formula` / `mem_formula` / `comm_formula` to include B explicitly. Weight-bytes lines now say "(shared across batch)" / "(weight, B-invariant)" so it's obvious what does and doesn't scale. Stages touched: S1..S10 (attention), C1/C2/C3 (attn comm), F1..F5 (FFN), CF1 (FFN AR). 2) Renamed the button/spinner/help copy from "latency-optimal" to "memory-optimal" to match the smallest-fit pick semantics I put in place earlier. The buttons already picked smallest-fit; the labels just still said "latency-optimal" from the previous iteration. Left the Auto Hardware sensitivity chart's "latency-optimal baseline" label alone — that panel is a HW co-design view where "how fast can each HW go?" is the intended question. Verified: 24 pytest tests still pass. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>