{"id":"z1-union-anchor-economics","title":"Z1 Sparse-DFT Pilot — Union-Anchor Economics","subtitle":"Cross-model cost analysis from recorded campaign artifacts: 558 naive vs 154 union anchors (72.4% fewer evaluations, 3.62×); union cost scales 139.5→154 from one to four models.","category":"validation","tags":["savings-stack","z1","union-anchor","sparse-dft","economics"],"source":"articles/docs/analysis/z1-union-anchor-economics.md","lang":"en","words":773,"readMinutes":4,"toc":[{"depth":2,"text":"1. Method","id":"1-method"},{"depth":2,"text":"2. Headline numbers (recomputed)","id":"2-headline-numbers-recomputed"},{"depth":2,"text":"3. The 29-vs-30 reconciliation","id":"3-the-29-vs-30-reconciliation"},{"depth":2,"text":"4. Discrepancy vs the prior chat-session numbers","id":"4-discrepancy-vs-the-prior-chat-session-numbers"},{"depth":2,"text":"5. Scaling note — union grows sub-linearly in model count","id":"5-scaling-note-union-grows-sub-linearly-in-model-count"},{"depth":2,"text":"Reproduce","id":"reproduce"}],"html":"<h1 id=\"z1-sparse-dft-pilot-union-anchor-economics\">Z1 Sparse-DFT Pilot — Union-Anchor Economics</h1><p><strong>Schema:</strong> <code>lupine.z1.union_anchor_economics.v1</code> · <strong>Data:</strong> <code>data/candidates/z1-union-anchor-economics.json</code> · <strong>Script:</strong> <code>tools/analysis/union_anchor_economics.py</code> · <strong>Recorded:</strong> 2026-07-21</p>\n<p>Cross-model cost analysis of the frozen sparse-anchor protocol\n(<code>docs/plans/2026-07-20-sparse-dft-pilot-preregistration.md</code>) on the locked\n30-path Z1 panel, computed <strong>from the recorded Round-4 float64 campaign\nartifacts only — no DFT was run</strong>. This note is the durable record of numbers\npreviously computed ad hoc in a chat session; the recomputed values below are\nauthoritative where they differ (see §4).</p>\n<h2 id=\"1-method\">1. Method</h2><p>Per model <code>m</code> and path <code>p</code>, the model&#39;s recorded <code>predicted_image_energies_ev</code>\nprofile (completed predictions only, mirrored from\n<code>gcp/sparse-dft-pilot/run_pilot.py:guided_paths</code>) selects extrema, and the\nfrozen rule (<code>gcp/mlip-cell-runner/z1_sparse_dft.py</code>, byte-equivalent copy in\nthe analysis script) builds the anchor set:</p>\n<blockquote>\n<p>A(m,p) = {0, n−1, argmin} ∪ {argmax−w … argmax+w}, clamped and de-duplicated;\nw = 2 when n ≤ 6 images, else 1.</p>\n</blockquote>\n<ul>\n<li><strong>Naive total</strong> = Σ_m Σ_p |A(m,p)| — each model pays its own sparse DFT.</li>\n<li><strong>Union total</strong> = Σ_p |∪_m A(m,p)| — one DFT evaluation per unique image\nindex per path, shared across models (endpoints are naturally shared).</li>\n<li><strong>Agreement</strong>: per path, whether the models&#39; argmax (saddle) indices, resp.\nboth argmin and argmax indices, coincide — exact and within ±1 image, under\ntwo conventions (§3).</li>\n</ul>\n<p>Sources (sha256 recorded in the JSON): panel\n<code>gs://shed-489901-atlas-inputs/z1/data/candidates/z1_nebdft2k_barriers.lock.json</code>;\nartifacts <code>gs://shed-489901-atlas-outputs/z1/campaign-float64/&lt;model&gt;/cell_result.json</code>\nwith model dirs <strong><code>chgnet</code>, <code>mace-mp-small</code>, <code>mace-mp-medium</code>, <code>mace-mpa-0-medium</code></strong>.\nAll 30 panel paths are analyzed, including the seven large-cell paths deferred\nfrom DFT <em>execution</em> (<code>data/candidates/z1-sparse-dft-deferred.json</code> lists\nindices 2, 8, 10, 18, 20, 23, 28 — its prose says &quot;six&quot;, the list holds seven;\nthey are excluded from GPAW runs, not from this prediction-side analysis).</p>\n<h2 id=\"2-headline-numbers-recomputed\">2. Headline numbers (recomputed)</h2><div class=\"table-wrap\"><table><thead><tr>\n<th>Basis</th>\n<th>Paths</th>\n<th>Model-path pairs</th>\n<th>Naive</th>\n<th>Union</th>\n<th>Saved</th>\n<th>Ratio</th>\n</tr>\n</thead><tbody><tr>\n<td data-label=\"Basis\">All analyzable paths (primary)</td>\n<td data-label=\"Paths\"><strong>29/30</strong></td>\n<td data-label=\"Model-path pairs\">111/120</td>\n<td data-label=\"Naive\"><strong>558</strong></td>\n<td data-label=\"Union\"><strong>154</strong></td>\n<td data-label=\"Saved\"><strong>72.4%</strong></td>\n<td data-label=\"Ratio\"><strong>3.6×</strong></td>\n</tr>\n<tr>\n<td data-label=\"Basis\">Fully-covered paths only</td>\n<td data-label=\"Paths\">26/30</td>\n<td data-label=\"Model-path pairs\">104/120</td>\n<td data-label=\"Naive\">520</td>\n<td data-label=\"Union\">136</td>\n<td data-label=\"Saved\">73.8%</td>\n<td data-label=\"Ratio\">3.8×</td>\n</tr>\n</tbody></table></div><p>Cross-model agreement over the 29 analyzable paths:</p>\n<div class=\"table-wrap\"><table><thead><tr>\n<th>Statistic</th>\n<th>Available-models convention</th>\n<th>All-four-required convention</th>\n</tr>\n</thead><tbody><tr>\n<td data-label=\"Statistic\">Saddle (argmax) exact</td>\n<td data-label=\"Available-models convention\">23/29</td>\n<td data-label=\"All-four-required convention\">20/29</td>\n</tr>\n<tr>\n<td data-label=\"Statistic\">Saddle within ±1</td>\n<td data-label=\"Available-models convention\">26/29</td>\n<td data-label=\"All-four-required convention\">23/29</td>\n</tr>\n<tr>\n<td data-label=\"Statistic\">Both extrema exact</td>\n<td data-label=\"Available-models convention\">10/29</td>\n<td data-label=\"All-four-required convention\">9/29</td>\n</tr>\n<tr>\n<td data-label=\"Statistic\">Both extrema within ±1</td>\n<td data-label=\"Available-models convention\">12/29</td>\n<td data-label=\"All-four-required convention\">11/29</td>\n</tr>\n</tbody></table></div><h2 id=\"3-the-29-vs-30-reconciliation\">3. The 29-vs-30 reconciliation</h2><p>The panel has 30 paths (indices 0–29). <strong>The true analyzable denominator is\n29</strong>: path index <strong>14 (<code>mp-756912_1_1_1_0_0</code>) failed CI-NEB convergence under\nthe frozen protocol in all four model artifacts</strong>, so no model profile exists\nto guide anchors — it is the one path with incomplete artifacts <em>across\nmodels</em>, and it is excluded with its per-model failure records in the JSON.</p>\n<p>Three more paths have partial coverage (agreement there is computed over the\nmodels present, which is why two conventions are reported): index 8 lacks\nmace-mp-small; index 13 lacks mace-mp-small and mace-mpa-0-medium; index 18\nlacks chgnet and mace-mp-small (all recorded campaign failures, never imputed).\nOnly 26 paths carry all four models.</p>\n<h2 id=\"4-discrepancy-vs-the-prior-chat-session-numbers\">4. Discrepancy vs the prior chat-session numbers</h2><p>The prior session reported: 624 naive vs 132 union (79% fewer, 4.7×), saddle\nagreement 20/29, both-extrema agreement 12/29.</p>\n<ul>\n<li><strong>Economics do not reproduce.</strong> Recomputed: <strong>558 naive, 154 union, 72.4%\n(3.6×)</strong> over the 29 analyzable paths; 520/136/73.8% (3.8×) over the 26\nfully-covered paths. No variant under the frozen anchor rule on these\nartifacts yields 624/132: 624 is near a (wrong) ±2-window-everywhere naive\ncount (625), but that variant&#39;s union is 166, and 132 is below even the\nmean <em>single-model</em> anchor total (139.5) — union ≥ any individual model&#39;s\ntotal on the same path set, so 132 is arithmetically incompatible with a\n4-model union on this panel. The artifacts are unchanged since (the chgnet\nartifact is byte-identical to the 2026-07-20 cached copy; GCS object\ntimestamps predate the prior session), so the chat figures most plausibly\nsuffered definitional/arithmetic drift. <strong>The recomputed values stand.</strong></li>\n<li><strong>Agreement counts reconcile cleanly.</strong> 20/29 saddle-exact is exactly the\nall-four-required convention; 12/29 matches both-extrema <strong>within ±1</strong>\n(available-models), not exact agreement. Under one consistent convention:\nsaddle exact 23/29 (available) or 20/29 (all-four); both extrema <strong>exact</strong>\n10/29 (available) or 9/29 (all-four). The prior &quot;12/29 both extrema&quot; was\nthe ±1-tolerance number, not exact.</li>\n</ul>\n<h2 id=\"5-scaling-note-union-grows-sub-linearly-in-model-count\">5. Scaling note — union grows sub-linearly in model count</h2><p>Union cost saturates quickly: models largely nominate the same images, so each\nadded model costs its full naive share but adds few <em>new</em> unique anchors.</p>\n<div class=\"table-wrap\"><table><thead><tr>\n<th>Models</th>\n<th>Naive (mean over subsets)</th>\n<th>Union (mean over subsets)</th>\n<th>Union, cumulative fixed order (chgnet → +mace-mp-small → +mace-mp-medium → +mace-mpa-0-medium)</th>\n</tr>\n</thead><tbody><tr>\n<td data-label=\"Models\">1</td>\n<td data-label=\"Naive (mean over subsets)\">139.5</td>\n<td data-label=\"Union (mean over subsets)\">139.5</td>\n<td data-label=\"Union, cumulative fixed order (chgnet → +mace-mp-small → +mace-mp-medium → +mace-mpa-0-medium)\">142</td>\n</tr>\n<tr>\n<td data-label=\"Models\">2</td>\n<td data-label=\"Naive (mean over subsets)\">279.0</td>\n<td data-label=\"Union (mean over subsets)\">147.8</td>\n<td data-label=\"Union, cumulative fixed order (chgnet → +mace-mp-small → +mace-mp-medium → +mace-mpa-0-medium)\">144</td>\n</tr>\n<tr>\n<td data-label=\"Models\">3</td>\n<td data-label=\"Naive (mean over subsets)\">418.5</td>\n<td data-label=\"Union (mean over subsets)\">152.0</td>\n<td data-label=\"Union, cumulative fixed order (chgnet → +mace-mp-small → +mace-mp-medium → +mace-mpa-0-medium)\">152</td>\n</tr>\n<tr>\n<td data-label=\"Models\">4</td>\n<td data-label=\"Naive (mean over subsets)\">558.0</td>\n<td data-label=\"Union (mean over subsets)\">154.0</td>\n<td data-label=\"Union, cumulative fixed order (chgnet → +mace-mp-small → +mace-mp-medium → +mace-mpa-0-medium)\">154</td>\n</tr>\n</tbody></table></div><p>Going from 1 → 4 models multiplies naive cost ~4× but union cost only ~1.10×\n(139.5 → 154 mean; 142 → 154 cumulative). Sharing anchors across an ensemble\nof guides is therefore close to free: four models&#39; worth of guidance for ~10%\nmore DFT than one, and the marginal union growth per added model is already\nflat at k=3.</p>\n<h2 id=\"reproduce\">Reproduce</h2><pre><code class=\"language-bash\">python3 tools/analysis/union_anchor_economics.py \\\n    --out data/candidates/z1-union-anchor-economics.json           # pulls from GCS\npython3 tools/analysis/union_anchor_economics.py --local &lt;dir&gt; \\\n    --out data/candidates/z1-union-anchor-economics.json           # offline artifacts\n</code></pre>\n"}