File size: 23,586 Bytes
e0be5bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5684452
55e5019
5684452
e0be5bb
 
 
2d80295
 
e0be5bb
 
 
2d80295
 
 
 
 
 
 
 
 
 
 
e0be5bb
2d80295
 
 
 
8296c45
e0be5bb
 
 
 
 
 
 
 
2d80295
 
 
 
 
 
 
 
 
 
 
 
e0be5bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8296c45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e0be5bb
 
 
 
 
 
2d80295
e0be5bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2d80295
 
 
 
 
 
 
e0be5bb
 
2d80295
 
 
e0be5bb
 
 
 
 
2d80295
 
 
 
e0be5bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2d80295
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e0be5bb
 
 
 
 
 
 
 
 
 
 
5684452
55e5019
e0be5bb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
<!doctype html><html lang="en"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>a11oy · Verifiable-AI Benchmark — 3-way MEASURED PINN (SZL vs DeepXDE vs NVIDIA PhysicsNeMo)</title>
<meta name="description" content="An honest, measured 3-way physics-informed-neural-network benchmark: SZL governed spectral (CPU) vs DeepXDE (GPU) vs NVIDIA PhysicsNeMo/Modulus (GPU). Every number carries its provenance label; the artifact passes the a11oy honesty gate in CI.">
<!-- SPDX-License-Identifier: Apache-2.0 · © 2026 SZL Holdings · Doctrine v11 · Signed: Forge -->
<style>
:root{--bg:#0a0b10;--panel:#12141d;--panel2:#171a25;--ink:#e8eaf0;--mut:#9aa0b4;--gold:#d9b35c;--line:#252938;--grn:#3fb950;--amb:#d29922;--red:#f85149;--blu:#5cc4bf;}
*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif}
a{color:var(--gold);text-decoration:none}a:hover{text-decoration:underline}
header{border-bottom:1px solid var(--line);padding:14px 22px;display:flex;align-items:center;gap:14px;background:linear-gradient(180deg,#10121b,#0a0b10)}
header .brand{font-weight:700;letter-spacing:.5px;color:var(--gold);font-size:18px}
header .tag{color:var(--mut);font-size:12px}
nav{display:flex;flex-wrap:wrap;gap:8px;padding:10px 22px;border-bottom:1px solid var(--line);background:var(--panel)}
nav a{font-size:12.5px;padding:4px 10px;border:1px solid var(--line);border-radius:999px;color:var(--mut)}
nav a:hover{border-color:var(--gold);color:var(--gold);text-decoration:none}
nav a.active{background:var(--gold);color:#0a0b10;border-color:var(--gold);font-weight:600}
main{max-width:1080px;margin:0 auto;padding:28px 22px 60px}
h1{font-size:27px;margin:0 0 6px;color:#fff}h2{font-size:18px;margin:30px 0 10px;color:var(--gold)}
.sub{color:var(--mut);margin:0 0 18px;font-size:13.5px}
.hero{background:linear-gradient(180deg,#141826,#0e1119);border:1px solid var(--line);border-radius:14px;padding:22px 24px;margin:14px 0 8px}
.hero .lede{font-size:15.5px;color:#d8dbe6;max-width:80ch}
.badges{display:flex;flex-wrap:wrap;gap:10px;margin:14px 0 2px}
.badge{display:inline-flex;align-items:center;gap:7px;padding:6px 12px;border-radius:999px;font-size:12.5px;font-weight:600;border:1px solid var(--line);background:var(--panel2)}
.badge .dot{width:8px;height:8px;border-radius:50%}
.badge.ok{border-color:rgba(63,185,80,.5);color:var(--grn)}.badge.ok .dot{background:var(--grn)}
.badge.info{border-color:rgba(92,196,191,.5);color:var(--blu)}.badge.info .dot{background:var(--blu)}
.card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:18px 20px;margin:14px 0}
.meta{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:12px;margin:12px 0}
.meta .m{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:11px 13px}
.meta .m .k{color:var(--mut);font-size:11px;text-transform:uppercase;letter-spacing:.4px}
.meta .m .v{color:var(--ink);font-size:13.5px;margin-top:3px}
table{width:100%;border-collapse:collapse;margin:10px 0;font-size:13.5px}
th,td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:top}
th{color:var(--mut);font-weight:600;font-size:11.5px;text-transform:uppercase;letter-spacing:.4px}
td .fw{font-weight:600;color:#fff}td .mc{color:var(--mut);font-size:12px}
.num{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px}
.pill{display:inline-block;padding:2px 9px;border-radius:999px;font-size:11px;font-weight:600}
.g{background:rgba(63,185,80,.15);color:var(--grn)}.a{background:rgba(210,153,34,.15);color:var(--amb)}.r{background:rgba(248,81,73,.15);color:var(--red)}.n{background:#1c2030;color:var(--mut)}.b{background:rgba(92,196,191,.14);color:var(--blu)}
.note{border-left:3px solid var(--gold);padding:9px 14px;background:rgba(217,179,92,.06);color:#d8dbe6;font-size:13px;margin:12px 0;border-radius:0 8px 8px 0}
.warn{border-left:3px solid var(--amb);background:rgba(210,153,34,.07)}
code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px}
pre{background:#0d0f17;border:1px solid var(--line);border-radius:10px;padding:14px;overflow:auto;color:#cdd3e3}
footer{border-top:1px solid var(--line);color:var(--mut);font-size:11.5px;padding:18px 22px;line-height:1.7;margin-top:30px}
.eq{color:var(--blu)}
.small{font-size:12px;color:var(--mut)}
</style>  <link rel="stylesheet" href="/assets/szl-flow.css" data-szl-flow-asset="style" />
  <link rel="stylesheet" href="/assets/szl-holo-v2.css" data-szl-holo-asset="style-v2" />
</head><body>
<header><span class="brand">a11oy</span><span class="tag">Verifiable AI · every number carries its proof</span></header>
<nav>
<a href="/console">← Console</a><a href="/pinn-console">PINN Console</a>
<a href="/benchmark" class="active">Benchmark</a><a href="/hologram">Command Bridge</a>
<a href="/verify">Verify</a><a href="/assurance">Assurance</a><a href="/company">Company</a>
</nav>
<main>
<div class="hero">
  <h1>One of one — the only governed PDE solver here that actually ships</h1>
  <p class="lede">Three arms, three problems, all <b>MEASURED</b> against exact closed forms or synthetic
  ground truth: SZL's governed classical spectral solver versus two neural physics-informed networks —
  <b>DeepXDE</b> and <b>NVIDIA PhysicsNeMo / Modulus</b>. We publish the config, the seeds, the license
  of every dependency, and — most importantly — <b>where this suite does <i>not</i> let us claim
  victory.</b> That honesty is the moat.</p>
  <p class="lede" style="margin-top:12px;color:#fff">SZL leads the field on the axis that decides real
  deployments — <b>verifiable, deployable governed solving</b>. It is the <b>only</b> arm that actually
  ships in the product, the <b>only</b> one that is license-clean (Apache-2.0, not LGPL), the
  <b>only</b> one re-derived from source in CI on every commit, and it reaches <b>machine precision</b>
  where the problem admits it — all measured on <b>our own metal</b>, not a rented cloud GPU farm.</p>
  <div class="badges">
    <span class="badge ok"><span class="dot"></span>One of one · only shipped arm</span>
    <span class="badge ok"><span class="dot"></span>Apache-2.0 · deployable</span>
    <span class="badge ok"><span class="dot"></span>Reproduced from source in CI</span>
    <span class="badge info"><span class="dot"></span><span id="metalBadge">Run on our own metal</span></span>
    <span class="badge ok"><span class="dot"></span><a href="https://github.com/szl-holdings/a11oy/actions/workflows/pinn-honesty-gate.yml" style="color:inherit">Honesty gate: PASS in CI</a></span>
    <span class="badge info"><span class="dot"></span>Doctrine v11 labels</span>
    <span class="badge info"><span class="dot"></span>Live artifact · <a href="/api/a11oy/v1/pinn/bench" style="color:inherit">/api/a11oy/v1/pinn/bench</a></span>
  </div>
  <p class="small" style="margin:10px 0 0">This page renders directly from the committed benchmark artifact — no numbers are typed into the page,
  so it cannot drift from the source of truth. The same artifact must pass
  <code>benchmarks/pinn/honesty_guard.py</code> before it can ship.</p>
</div>

<section class="card" id="holoWrap" style="padding:0;overflow:hidden;position:relative">
  <div style="padding:16px 20px 6px">
    <h2 style="margin:0">Holographic showcase — the measured field, in 3D</h2>
    <p class="small" style="margin:6px 0 0">A live hologram of the artifact: each bar is <b>−log₁₀(error)</b> pulled straight from
    <code>/api/a11oy/v1/pinn/bench</code> — taller means more accurate. Gold = SZL governed spectral · muted = the neural PINNs.
    No heights are hard-coded; if the numbers change, the hologram changes.</p>
  </div>
  <canvas id="holo" style="display:block;width:100%;height:420px;background:radial-gradient(circle at 50% 38%,#0e1322,#070810)"></canvas>
  <div id="holoLegend" class="small" style="padding:9px 20px 16px;color:var(--mut)">Materialising the measured field…</div>
  <noscript><div class="note" style="margin:0 20px 16px">The 3D showcase needs JavaScript; the measured tables below are fully static and complete.</div></noscript>
</section>

<div id="status" class="note">Loading measured results from <code>/api/a11oy/v1/pinn/bench</code>…</div>

<div id="report" hidden>
  <h2 id="benchTitle"></h2>
  <p class="sub" id="overallLabel"></p>
  <div class="meta" id="meta"></div>
  <div id="problems"></div>

  <h2>How to read this</h2>
  <div class="card" id="interpretation"></div>

  <h2>What we are <span style="color:var(--red)">not</span> claiming</h2>
  <div class="note warn" id="scopeLimits"></div>
  <div class="note" id="honesty"></div>

  <h2>Reproduce it yourself</h2>
  <p class="sub">Nothing here is take-our-word-for-it. The exact commands that produced the artifact:</p>
  <pre id="reproduce"></pre>
  <p class="small" id="doctrine"></p>
</div>

<h2>Why this benchmark is different</h2>
<div class="card">
  <p style="margin:0 0 10px">Content-provenance tools prove where a <i>file</i> came from. Governance platforms document a
  <i>process</i>. Evaluation suites <i>score</i> a model. None of them <b>break the build when a result
  overclaims.</b> a11oy does:</p>
  <ul style="margin:0;color:#d8dbe6">
    <li>Every reported number is stamped <span class="pill g">MEASURED</span> / <span class="pill b">MODELED</span> /
      <span class="pill n">NOT-RUN</span> / <span class="pill n">NOT-MEASURED</span> / <span class="pill n">NOT-TESTED</span>.</li>
    <li>A <b>measured</b> number with no evidence, or a <b>not-run</b> arm carrying a value, fails the honesty gate — the artifact cannot ship.</li>
    <li>Our advantages are <b>disclosed</b>: e.g. the Poisson solution lives inside SZL's trial basis, so that near-machine-precision result is by construction, not a general-accuracy claim.</li>
  </ul>
</div>

<h2>Verify the source</h2>
<div class="card">
  <p style="margin:0 0 10px">This page is public and so is everything behind it. Inspect the code that
  produces — and polices — these numbers on the public
  <a href="https://github.com/szl-holdings/a11oy">szl-holdings/a11oy</a> repository:</p>
  <ul style="margin:0;color:#d8dbe6">
    <li>The measured artifact —
      <a href="https://github.com/szl-holdings/a11oy/blob/main/benchmarks/pinn/results.json"><code>benchmarks/pinn/results.json</code></a>,
      served read-only at <a href="/api/a11oy/v1/pinn/bench"><code>/api/a11oy/v1/pinn/bench</code></a> (this page renders it — no numbers are typed in).</li>
    <li>The benchmark harness —
      <a href="https://github.com/szl-holdings/a11oy/blob/main/benchmarks/pinn/run_bench.py"><code>benchmarks/pinn/run_bench.py</code></a>.
      The SZL arm is NumPy-only; the DeepXDE / PhysicsNeMo arms are lazy-imported and never shipped.</li>
    <li>The honesty gate —
      <a href="https://github.com/szl-holdings/a11oy/blob/main/benchmarks/pinn/honesty_guard.py"><code>benchmarks/pinn/honesty_guard.py</code></a>
      over the reusable
      <a href="https://github.com/szl-holdings/a11oy/tree/main/verifiable-ai"><code>verifiable-ai/</code></a>
      core: a MEASURED number with no evidence, or a NOT-RUN arm carrying a value, fails the build.</li>
    <li>The reproducibility gate —
      <a href="https://github.com/szl-holdings/a11oy/blob/main/benchmarks/pinn/reproduce_szl_guard.py"><code>benchmarks/pinn/reproduce_szl_guard.py</code></a>:
      CI re-derives the SZL classical-spectral arm from source and asserts it still matches the published numbers.</li>
    <li>The CI itself —
      <a href="https://github.com/szl-holdings/a11oy/blob/main/.github/workflows/pinn-honesty-gate.yml"><code>pinn-honesty-gate.yml</code></a>
      · <a href="https://github.com/szl-holdings/a11oy/actions/workflows/pinn-honesty-gate.yml">live runs on GitHub Actions</a>.</li>
  </ul>
  <p class="small" style="margin:10px 0 0">Both gates run on every change before it can reach <code>main</code>:
  the labels cannot overclaim, and the classical-arm numbers cannot drift from source. That is what
  <b>verifiable</b> means here — not a promise, a build check.</p>
</div>

</main>
<footer>
SPDX-License-Identifier: Apache-2.0 · © 2026 SZL Holdings · a11oy — governed, verifiable AI · Doctrine v11.<br>
Data source: the committed <code>benchmarks/pinn/results.json</code>, served read-only at <code>/api/a11oy/v1/pinn/bench</code>.
DeepXDE (LGPL-2.1) and NVIDIA PhysicsNeMo/Modulus (Apache-2.0) are benchmark-only dev dependencies — never imported by shipped code.
</footer>
<script src="/vendor/three.min.js"></script>
<script>
(function(){
  var FW = {
    szl: {name:"SZL", cls:"spectral collocation · CPU", tag:"b"},
    deepxde: {name:"DeepXDE", cls:"neural PINN · GPU", tag:"n"},
    modulus_physicsnemo: {name:"NVIDIA PhysicsNeMo / Modulus", cls:"neural PINN · GPU", tag:"n"}
  };
  function esc(s){return String(s==null?"":s).replace(/[&<>]/g,function(c){return {"&":"&amp;","<":"&lt;",">":"&gt;"}[c];});}
  function fnum(v){
    if(v==null) return "—";
    if(typeof v!=="number") return esc(v);
    var a=Math.abs(v);
    if(a!==0 && (a<1e-2 || a>=1e4)) return v.toExponential(2);
    return (Math.round(v*1e4)/1e4).toString();
  }
  function metricCell(arm,metric){
    var v=arm[metric];
    if(v==null) return '<span class="num">—</span>';
    if(typeof v==="object"){
      var m=fnum(v.median), lo=fnum(v.min), hi=fnum(v.max);
      return '<span class="num">'+m+'</span> <span class="mc">('+lo+'–'+hi+', n='+esc(v.n)+')</span>';
    }
    return '<span class="num">'+fnum(v)+'</span>';
  }
  function wallCell(arm){
    var w=arm.wall_s;
    if(w==null) return '<span class="mc">—</span>';
    if(typeof w==="object") return '<span class="num">'+fnum(w.median)+'s</span> <span class="mc">('+fnum(w.min)+'–'+fnum(w.max)+')</span>';
    return '<span class="num">'+fnum(w)+'s</span>';
  }
  function labelPill(lbl){
    if(!lbl) return '';
    var head=String(lbl).split(" ")[0];
    var cls = head.indexOf("MEASURED")===0?"g":head.indexOf("MODELED")===0?"b":"n";
    return '<span class="pill '+cls+'">'+esc(head)+'</span>';
  }
  function render(d){
    document.getElementById("status").hidden=true;
    var rep=document.getElementById("report"); rep.hidden=false;
    document.getElementById("benchTitle").textContent=d.title||"PINN benchmark";
    document.getElementById("overallLabel").textContent=d.overall_label||"";
    var hw=d.hardware||{};
    var neuralDevice="";
    (d.problems||[]).forEach(function(p){(p.arms||[]).forEach(function(a){
      if(a.framework!=="szl" && a.device && /gpu|rtx|cuda|geforce|a100|h100|radeon/i.test(a.device) && !neuralDevice) neuralDevice=a.device;
    });});
    var shortDev=neuralDevice.replace(/^NVIDIA GeForce /,"");
    var mb=document.getElementById("metalBadge");
    if(mb) mb.textContent = shortDev ? ("Our own metal · "+shortDev) : "Run on our own metal";
    var meta=[
      ["Assembled at", d.ran_at||"—"],
      ["SZL arm (shipped)", "CPU-only — no GPU required"],
      ["Neural competitors", neuralDevice ? ("our own "+neuralDevice) : "a CUDA GPU host (see each arm)"],
      ["Our metal", neuralDevice ? "SZL-owned hardware — not a rented cloud GPU" : "see each arm"],
      ["Assemble host", (hw.cpus||"?")+" CPU · "+(hw.ram_gib||"?")+" GiB · GPU: "+(hw.gpu||"none")],
      ["Doctrine", "v11 — labelled numbers only"]
    ];
    document.getElementById("meta").innerHTML=meta.map(function(m){
      return '<div class="m"><div class="k">'+esc(m[0])+'</div><div class="v">'+esc(m[1])+'</div></div>';}).join("");
    try{ renderHologram(d, neuralDevice); }catch(e){
      var hl=document.getElementById("holoLegend");
      if(hl) hl.textContent="(3D showcase unavailable in this browser — the measured tables below are complete.)";
    }

    var out="";
    (d.problems||[]).forEach(function(p){
      var metric=p.metric||"rel_l2_vs_exact";
      out+='<div class="card"><h3 style="margin:0 0 4px;color:#fff">'+esc(p.id)+'</h3>';
      out+='<p class="small" style="margin:0 0 2px"><span class="eq">'+esc(p.pde)+'</span></p>';
      out+='<p class="small" style="margin:0 0 8px">exact: '+esc(p.exact)+' · metric: <b>'+esc(metric)+'</b></p>';
      out+='<table><thead><tr><th>Framework</th><th>Method</th><th>'+esc(metric)+'</th><th>wall</th><th>seeds</th><th>device</th><th>label</th></tr></thead><tbody>';
      (p.arms||[]).forEach(function(a){
        var fw=FW[a.framework]||{name:a.framework,cls:a.method_class||""};
        var method=a.method||a.method_class||fw.cls||"";
        out+='<tr><td><span class="fw">'+esc(fw.name)+'</span><br><span class="mc">'+esc(fw.cls)+'</span></td>'
          +'<td class="mc">'+esc(method)+'</td>'
          +'<td>'+metricCell(a,metric)+'</td>'
          +'<td>'+wallCell(a)+'</td>'
          +'<td class="mc">'+esc(a.seeds_run||(typeof a[metric]==="object"?a[metric].n:1))+'</td>'
          +'<td class="mc">'+esc(a.device||(a.framework==="szl"?"CPU":"—"))+'</td>'
          +'<td>'+labelPill(a.label)+'</td></tr>';
        var extra=a.caveat||a.disclosure;
        if(a.caveat) out+='<tr><td colspan="7" class="mc" style="border-bottom:1px solid var(--line);padding-top:0"><span class="pill a">caveat</span> '+esc(a.caveat)+'</td></tr>';
      });
      out+='</tbody></table>';
      if(p.disclosure&&p.disclosure.note) out+='<div class="note">Disclosure: '+esc(p.disclosure.note)+'</div>';
      out+='</div>';
    });
    document.getElementById("problems").innerHTML=out;

    var interp=d.interpretation||{};
    document.getElementById("interpretation").innerHTML=Object.keys(interp).map(function(k){
      return '<p style="margin:6px 0"><b style="color:var(--gold)">'+esc(k)+':</b> '+esc(interp[k])+'</p>';}).join("");
    document.getElementById("scopeLimits").innerHTML="<b>Scope limits.</b> "+esc(d.scope_limits||"");
    document.getElementById("honesty").innerHTML="<b>Honesty.</b> "+esc(d.honesty||"");
    var rep2=d.reproduce||{};
    document.getElementById("reproduce").textContent=Object.keys(rep2).map(function(k){return "# "+k+"\n"+rep2[k];}).join("\n\n");
    document.getElementById("doctrine").textContent=d.doctrine||"";
  }
  function renderHologram(d, neuralDevice){
    if(!window.THREE) throw new Error("three unavailable");
    var canvas=document.getElementById("holo"); if(!canvas) return;
    var probs=(d.problems||[]).slice(0,6);
    if(!probs.length) return;
    function metricVal(a,metric){
      var v=a[metric];
      if(v==null){["rel_l2_vs_exact","rel_l2","abs_err","rel_l2_vs_truth","alpha_abs_err","err"].some(function(k){if(a[k]!=null){v=a[k];return true;}return false;});}
      if(v&&typeof v==="object") v=(v.median!=null?v.median:(v.min!=null?v.min:null));
      return (typeof v==="number")?v:null;
    }
    var COL={szl:0xe6c169, deepxde:0x5cc4bf, modulus_physicsnemo:0x9fe870};
    var NAME={szl:"SZL", deepxde:"DeepXDE", modulus_physicsnemo:"PhysicsNeMo"};
    var scene=new THREE.Scene(); scene.fog=new THREE.FogExp2(0x070810,0.055);
    var W=canvas.clientWidth||900, Hh=canvas.clientHeight||420;
    var cam=new THREE.PerspectiveCamera(46, W/Hh, 0.1, 100);
    cam.position.set(6.6,5.4,8.6); cam.lookAt(0,1.7,0);
    var rnd=new THREE.WebGLRenderer({canvas:canvas,antialias:true,alpha:true});
    rnd.setPixelRatio(Math.min(window.devicePixelRatio||1,2)); rnd.setSize(W,Hh,false);
    scene.add(new THREE.AmbientLight(0x8899bb,0.65));
    var key=new THREE.PointLight(0xffffff,0.9); key.position.set(6,11,6); scene.add(key);
    scene.add(new THREE.GridHelper(15,30,0x2a3350,0x161d30));
    var group=new THREE.Group(); scene.add(group);
    var nP=probs.length, gap=3.0, barW=0.58, armGap=0.74;
    function label(text,color,scale){
      var c=document.createElement("canvas"); c.width=256; c.height=64;
      var g=c.getContext("2d"); g.font="bold 30px -apple-system,Segoe UI,Roboto,sans-serif";
      g.fillStyle=color||"#e8eaf0"; g.textAlign="center"; g.textBaseline="middle"; g.fillText(text,128,34);
      var tex=new THREE.CanvasTexture(c); tex.minFilter=THREE.LinearFilter;
      var sp=new THREE.Sprite(new THREE.SpriteMaterial({map:tex,transparent:true,depthTest:false}));
      sp.scale.set(scale||2.4,(scale||2.4)/4,1); return sp;
    }
    probs.forEach(function(p,pi){
      var metric=p.metric||"rel_l2_vs_exact", arms=(p.arms||[]);
      var x0=(pi-(nP-1)/2)*gap;
      arms.forEach(function(a,ai){
        var err=metricVal(a,metric);
        var h=(err!=null&&err>0)?Math.max(0.15,-Math.log(err)/Math.LN10):(err===0?16:0.15);
        h=h*0.42; if(h>7)h=7;
        var z=(ai-(arms.length-1)/2)*armGap;
        var col=(COL[a.framework]!=null)?COL[a.framework]:0x8899bb, isSZL=(a.framework==="szl");
        var geo=new THREE.BoxGeometry(barW,h,barW);
        var bar=new THREE.Mesh(geo,new THREE.MeshStandardMaterial({color:col,emissive:col,emissiveIntensity:isSZL?0.55:0.28,metalness:0.3,roughness:0.35,transparent:true,opacity:isSZL?0.96:0.8}));
        bar.position.set(x0+z,h/2,0); group.add(bar);
        var wf=new THREE.LineSegments(new THREE.EdgesGeometry(geo),new THREE.LineBasicMaterial({color:col,transparent:true,opacity:0.55}));
        wf.position.copy(bar.position); group.add(wf);
      });
      var pl=label(String(p.id||("problem "+(pi+1))).split("_")[0],"#d9b35c",2.7);
      pl.position.set(x0,-0.55,1.25); group.add(pl);
    });
    (function(){
      var arms0=(probs[0].arms||[]);
      arms0.forEach(function(a,ai){
        var z=(ai-(arms0.length-1)/2)*armGap;
        var hex="#"+("000000"+((COL[a.framework]||0x8899bb)>>>0).toString(16)).slice(-6);
        var sp=label(NAME[a.framework]||a.framework,hex,1.9);
        sp.position.set(((-(nP-1)/2)*gap)+z-3.2,0.45,0); group.add(sp);
      });
    })();
    var lg=document.getElementById("holoLegend");
    if(lg){
      lg.innerHTML='<b style="color:#e6c169">■ SZL</b> governed spectral · '
        +'<b style="color:#5cc4bf">■ DeepXDE</b> · <b style="color:#9fe870">■ PhysicsNeMo</b>'
        +' &nbsp;·&nbsp; height = −log₁₀(error), taller = more accurate.'
        +(neuralDevice?(' &nbsp;·&nbsp; neural arms measured on our own <b>'+esc(neuralDevice)+'</b>.'):'')
        +' The Poisson tower is machine-precision <b>by construction</b> (disclosed above), not a general-accuracy claim.';
    }
    var t0=Date.now();
    (function loop(){
      var t=(Date.now()-t0)/1000;
      group.rotation.y=Math.sin(t*0.16)*0.5+t*0.05;
      rnd.render(scene,cam); requestAnimationFrame(loop);
    })();
    window.addEventListener("resize",function(){
      var w=canvas.clientWidth||900,h2=canvas.clientHeight||420;
      cam.aspect=w/h2; cam.updateProjectionMatrix(); rnd.setSize(w,h2,false);
    });
  }
  fetch("/api/a11oy/v1/pinn/bench",{headers:{accept:"application/json"}})
    .then(function(r){ if(!r.ok) throw new Error("HTTP "+r.status); return r.json(); })
    .then(render)
    .catch(function(e){
      document.getElementById("status").innerHTML=
        'Live benchmark data is not reachable right now (<code>'+esc(e.message)+'</code>). '+
        'The measured artifact is served at <a href="/api/a11oy/v1/pinn/bench">/api/a11oy/v1/pinn/bench</a> — '+
        'this page intentionally shows no numbers it cannot fetch from that source.';
    });
})();
</script>
  <script src="/assets/szl-flow.js" defer data-szl-flow-asset="script"></script>
  <script src="/assets/szl-holo-v2.js" defer data-szl-holo-asset="script-v2"></script>
</body></html>