Replace duplicate spotlight with AI vs Physics panel
Browse files- index.html +4 -3
index.html
CHANGED
|
@@ -58,7 +58,7 @@ svg{width:100%;height:auto;display:block}.lg{display:flex;flex-wrap:wrap;gap:6px
|
|
| 58 |
<div id="status">Loading forecasts and observations…</div>
|
| 59 |
<div class="grid">
|
| 60 |
<div class="pn"><h2 id="h1">Most accurate model</h2><div id="champ"></div></div>
|
| 61 |
-
<div class="pn dw"><h2>
|
| 62 |
</div>
|
| 63 |
<div class="pn" style="margin-top:14px"><h2>Champions at a glance: who is no. 1</h2>
|
| 64 |
<h3 class="h3">By period and forecast day, 24 cities</h3><div class="tw"><table class="wt" id="wper"></table></div>
|
|
@@ -153,9 +153,10 @@ function render(){
|
|
| 153 |
else{
|
| 154 |
$("status").textContent=`All models scored as issued, on the cases every listed model covers.${R.OUT.length?" Not listed for this selection (insufficient coverage): "+R.OUT.map(m=>MODELS[m][0]).join(", ")+".":""}${rows[0].n<30?" Small sample: results for a single day or city vary widely.":""}`;
|
| 155 |
const c=rows[0],M=inf(c.m);
|
| 156 |
-
$("champ").innerHTML=`<div class="champ"><div class="medal">1</div><div><div class="cn">${M[0]}</div><div class="sub" style="margin:6px 0">${flag(M[3],M[4])}${M[1]} ${tyb(c.m)}</div><div class="big">${c.r.toFixed(2)}<small>°C RMSE</small></div><div class="sub">${c.n.toLocaleString()} verified forecasts, ${span}</div></div></div>`+
|
| 157 |
`<div class="run">${rows.slice(1,3).map(x=>`<div class="rn"><div class="k">NO. ${x.rk}</div><div class="v">${inf(x.m)[0]}</div><div class="sub">${flag(inf(x.m)[3],inf(x.m)[4])}${x.r.toFixed(2)} °C</div></div>`).join("")}</div>`;
|
| 158 |
-
|
|
|
|
| 159 |
const mx=Math.max(...rows.map(x=>x.r));let h="";
|
| 160 |
rows.forEach(x=>{const M=inf(x.m),d=x.m==="darwin";h+=`<div class="bar ${x.rk===1?"f":""} ${d?"dwr":""}"><div class="rk">${x.rk}</div><div class="nm">${M[0]}<span class="d">${flag(M[3],M[4])}${M[1]} ${tyb(x.m)}${d?" fusion":""}</span></div><div class="trk"><i style="width:${x.r/mx*100}%;background:${d?"linear-gradient(90deg,#35d0ff,#9be9ff)":M[5]}"></i></div><div class="val">${x.r.toFixed(2)}</div></div>`});
|
| 161 |
$("bars").innerHTML=h;
|
|
|
|
| 58 |
<div id="status">Loading forecasts and observations…</div>
|
| 59 |
<div class="grid">
|
| 60 |
<div class="pn"><h2 id="h1">Most accurate model</h2><div id="champ"></div></div>
|
| 61 |
+
<div class="pn dw"><h2>AI vs Physics (Supercomputer)</h2><div id="dwc"></div></div>
|
| 62 |
</div>
|
| 63 |
<div class="pn" style="margin-top:14px"><h2>Champions at a glance: who is no. 1</h2>
|
| 64 |
<h3 class="h3">By period and forecast day, 24 cities</h3><div class="tw"><table class="wt" id="wper"></table></div>
|
|
|
|
| 153 |
else{
|
| 154 |
$("status").textContent=`All models scored as issued, on the cases every listed model covers.${R.OUT.length?" Not listed for this selection (insufficient coverage): "+R.OUT.map(m=>MODELS[m][0]).join(", ")+".":""}${rows[0].n<30?" Small sample: results for a single day or city vary widely.":""}`;
|
| 155 |
const c=rows[0],M=inf(c.m);
|
| 156 |
+
$("champ").innerHTML=`<div class="champ"><div class="medal">1</div><div><div class="cn">${M[0]}</div><div class="sub" style="margin:6px 0">${flag(M[3],M[4])}${M[1]} ${tyb(c.m)}</div><div class="big">${c.r.toFixed(2)}<small>°C RMSE</small></div>${rows[1]&&c.r<rows[1].r?`<div class="gain" style="margin:8px 0 6px">${((1-c.r/rows[1].r)*100).toFixed(1)}% lower error than no. 2</div>`:""}<div class="sub">${c.n.toLocaleString()} verified forecasts, ${span}</div></div></div>`+
|
| 157 |
`<div class="run">${rows.slice(1,3).map(x=>`<div class="rn"><div class="k">NO. ${x.rk}</div><div class="v">${inf(x.m)[0]}</div><div class="sub">${flag(inf(x.m)[3],inf(x.m)[4])}${x.r.toFixed(2)} °C</div></div>`).join("")}</div>`;
|
| 158 |
+
const bAI=rows.find(x=>inf(x.m)[2]==="AI"),bPH=rows.find(x=>inf(x.m)[2]!=="AI"),vs=(x,lab)=>x?`<div class="rn" style="margin-bottom:10px"><div class="k">BEST ${lab} · NO. ${x.rk} OVERALL</div><div class="v">${inf(x.m)[0]}</div><div class="sub">${flag(inf(x.m)[3],inf(x.m)[4])}${inf(x.m)[1]} <b style="color:#fff;font-size:18px">${x.r.toFixed(2)} °C</b></div></div>`:"";
|
| 159 |
+
$("dwc").innerHTML=vs(bAI,"AI")+vs(bPH,"PHYSICS (SUPERCOMPUTER)")+(bAI&&bPH?`<div class="gain">${bAI.r<bPH.r?"AI leads by "+((1-bAI.r/bPH.r)*100).toFixed(1)+"%":"Physics leads by "+((1-bPH.r/bAI.r)*100).toFixed(1)+"%"}</div><div class="sub" style="margin-top:10px">${rows.filter(x=>inf(x.m)[2]==="AI").length} AI models and ${rows.filter(x=>inf(x.m)[2]!=="AI").length} physics models on this board</div>`:"");
|
| 160 |
const mx=Math.max(...rows.map(x=>x.r));let h="";
|
| 161 |
rows.forEach(x=>{const M=inf(x.m),d=x.m==="darwin";h+=`<div class="bar ${x.rk===1?"f":""} ${d?"dwr":""}"><div class="rk">${x.rk}</div><div class="nm">${M[0]}<span class="d">${flag(M[3],M[4])}${M[1]} ${tyb(x.m)}${d?" fusion":""}</span></div><div class="trk"><i style="width:${x.r/mx*100}%;background:${d?"linear-gradient(90deg,#35d0ff,#9be9ff)":M[5]}"></i></div><div class="val">${x.r.toFixed(2)}</div></div>`});
|
| 162 |
$("bars").innerHTML=h;
|