fix(dashboard): add alpha temperature to training losses panel

This commit is contained in:
2026-08-24 09:10:46 +02:00
parent 8eb7c53dd0
commit 8872be3ff6
2 changed files with 123 additions and 116 deletions
+108 -107
View File
@@ -1,7 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1400" height="1720" viewBox="0 0 1400 1720" font-family="sans-serif">
<rect width="1400" height="1720" fill="white"/>
<text x="700" y="32" text-anchor="middle" font-size="21" font-weight="bold">SAC-LSTM campaign dashboard - live run (current only)</text>
<text x="700" y="56" text-anchor="middle" font-size="12" fill="#555">generated 2026-08-24 09:05:32 - auto-reloads every 60 s (open this file in Chrome)</text>
<text x="700" y="56" text-anchor="middle" font-size="12" fill="#555">generated 2026-08-24 09:10:32 - auto-reloads every 60 s (open this file in Chrome)</text>
<text x="70" y="100" font-size="15" font-weight="bold">Test matches - win % vs opponents</text>
<text x="70" y="115" font-size="11" fill="#555">raw dots = single test matches, thick = rolling-mean-10</text>
<line x1="70" y1="720.0" x2="697" y2="720.0" stroke="#dddddd"/>
@@ -14,22 +14,26 @@
<line x1="70" y1="720" x2="70" y2="120" stroke="black"/>
<line x1="70.0" y1="720" x2="70.0" y2="724" stroke="black"/>
<text x="70.0" y="737" text-anchor="middle" font-size="11">1</text>
<line x1="148.4" y1="720" x2="148.4" y2="724" stroke="black"/>
<text x="148.4" y="737" text-anchor="middle" font-size="11">2</text>
<line x1="226.8" y1="720" x2="226.8" y2="724" stroke="black"/>
<text x="226.8" y="737" text-anchor="middle" font-size="11">3</text>
<line x1="305.1" y1="720" x2="305.1" y2="724" stroke="black"/>
<text x="305.1" y="737" text-anchor="middle" font-size="11">4</text>
<line x1="132.7" y1="720" x2="132.7" y2="724" stroke="black"/>
<text x="132.7" y="737" text-anchor="middle" font-size="11">2</text>
<line x1="195.4" y1="720" x2="195.4" y2="724" stroke="black"/>
<text x="195.4" y="737" text-anchor="middle" font-size="11">3</text>
<line x1="258.1" y1="720" x2="258.1" y2="724" stroke="black"/>
<text x="258.1" y="737" text-anchor="middle" font-size="11">4</text>
<line x1="320.8" y1="720" x2="320.8" y2="724" stroke="black"/>
<text x="320.8" y="737" text-anchor="middle" font-size="11">5</text>
<line x1="383.5" y1="720" x2="383.5" y2="724" stroke="black"/>
<text x="383.5" y="737" text-anchor="middle" font-size="11">5</text>
<line x1="461.9" y1="720" x2="461.9" y2="724" stroke="black"/>
<text x="461.9" y="737" text-anchor="middle" font-size="11">6</text>
<line x1="540.2" y1="720" x2="540.2" y2="724" stroke="black"/>
<text x="540.2" y="737" text-anchor="middle" font-size="11">7</text>
<line x1="618.6" y1="720" x2="618.6" y2="724" stroke="black"/>
<text x="618.6" y="737" text-anchor="middle" font-size="11">8</text>
<text x="383.5" y="737" text-anchor="middle" font-size="11">6</text>
<line x1="446.2" y1="720" x2="446.2" y2="724" stroke="black"/>
<text x="446.2" y="737" text-anchor="middle" font-size="11">7</text>
<line x1="508.9" y1="720" x2="508.9" y2="724" stroke="black"/>
<text x="508.9" y="737" text-anchor="middle" font-size="11">8</text>
<line x1="571.6" y1="720" x2="571.6" y2="724" stroke="black"/>
<text x="571.6" y="737" text-anchor="middle" font-size="11">9</text>
<line x1="634.3" y1="720" x2="634.3" y2="724" stroke="black"/>
<text x="634.3" y="737" text-anchor="middle" font-size="11">10</text>
<line x1="697.0" y1="720" x2="697.0" y2="724" stroke="black"/>
<text x="697.0" y="737" text-anchor="middle" font-size="11">9</text>
<text x="697.0" y="737" text-anchor="middle" font-size="11">11</text>
<line x1="66" y1="720.0" x2="70" y2="720.0" stroke="black"/>
<text x="63" y="724.0" text-anchor="end" font-size="11">0</text>
<line x1="66" y1="600.0" x2="70" y2="600.0" stroke="black"/>
@@ -45,42 +49,48 @@
<text x="383" y="753" text-anchor="middle" font-size="12">test match number (each opponent)</text>
<text x="16" y="420" text-anchor="middle" font-size="12" transform="rotate(-90 16 420)">win rate (%)</text>
<circle cx="70.0" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="148.4" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="226.8" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="305.1" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="132.7" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="195.4" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="258.1" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="320.8" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="383.5" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="461.9" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="540.2" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="618.6" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="446.2" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="508.9" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="571.6" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="634.3" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="697.0" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<polyline points="70.0,720.0 148.4,720.0 226.8,720.0 305.1,720.0 383.5,720.0 461.9,720.0 540.2,720.0 618.6,720.0 697.0,720.0" fill="none" stroke="#d62728" stroke-width="3.5" opacity="1.0"/>
<polyline points="70.0,720.0 132.7,720.0 195.4,720.0 258.1,720.0 320.8,720.0 383.5,720.0 446.2,720.0 508.9,720.0 571.6,720.0 634.3,720.0 697.0,720.0" fill="none" stroke="#d62728" stroke-width="3.5" opacity="1.0"/>
<circle cx="70.0" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="148.4" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="226.8" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="305.1" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="132.7" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="195.4" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="258.1" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="320.8" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="383.5" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="461.9" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="540.2" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="618.6" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="446.2" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="508.9" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="571.6" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="634.3" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="697.0" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<polyline points="70.0,720.0 148.4,720.0 226.8,720.0 305.1,720.0 383.5,720.0 461.9,720.0 540.2,720.0 618.6,720.0 697.0,720.0" fill="none" stroke="#1f77b4" stroke-width="3.5" opacity="1.0"/>
<polyline points="70.0,720.0 132.7,720.0 195.4,720.0 258.1,720.0 320.8,720.0 383.5,720.0 446.2,720.0 508.9,720.0 571.6,720.0 634.3,720.0 697.0,720.0" fill="none" stroke="#1f77b4" stroke-width="3.5" opacity="1.0"/>
<circle cx="70.0" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="148.4" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="226.8" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="305.1" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="132.7" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="195.4" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="258.1" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="320.8" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="383.5" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="461.9" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="540.2" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="618.6" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="446.2" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="508.9" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="571.6" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="634.3" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="697.0" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<polyline points="70.0,720.0 148.4,720.0 226.8,720.0 305.1,720.0 383.5,720.0 461.9,720.0 540.2,720.0 618.6,720.0 697.0,720.0" fill="none" stroke="#2ca02c" stroke-width="3.5" opacity="1.0"/>
<polyline points="70.0,720.0 132.7,720.0 195.4,720.0 258.1,720.0 320.8,720.0 383.5,720.0 446.2,720.0 508.9,720.0 571.6,720.0 634.3,720.0 697.0,720.0" fill="none" stroke="#2ca02c" stroke-width="3.5" opacity="1.0"/>
<line x1="82" y1="772" x2="110" y2="772" stroke="#d62728" stroke-width="3"/>
<text x="116" y="776" font-size="12">Corners - 9 evals</text>
<text x="116" y="776" font-size="12">Corners - 11 evals</text>
<line x1="82" y1="790" x2="110" y2="790" stroke="#1f77b4" stroke-width="3"/>
<text x="116" y="794" font-size="12">Crazy - 9 evals</text>
<text x="116" y="794" font-size="12">Crazy - 11 evals</text>
<line x1="82" y1="808" x2="110" y2="808" stroke="#2ca02c" stroke-width="3"/>
<text x="116" y="812" font-size="12">Target - 9 evals</text>
<text x="747" y="100" font-size="15" font-weight="bold">Training losses (log scale)</text>
<text x="116" y="812" font-size="12">Target - 11 evals</text>
<text x="747" y="100" font-size="15" font-weight="bold">Training losses &amp; alpha (log scale)</text>
<text x="747" y="115" font-size="11" fill="#555">training_metrics.jsonl - big early spikes are normal</text>
<line x1="747" y1="720.0" x2="1375" y2="720.0" stroke="#dddddd"/>
<line x1="747" y1="570.0" x2="1375" y2="570.0" stroke="#dddddd"/>
@@ -92,13 +102,13 @@
<line x1="747.0" y1="720" x2="747.0" y2="724" stroke="black"/>
<text x="747.0" y="737" text-anchor="middle" font-size="11">1</text>
<line x1="904.0" y1="720" x2="904.0" y2="724" stroke="black"/>
<text x="904.0" y="737" text-anchor="middle" font-size="11">6</text>
<text x="904.0" y="737" text-anchor="middle" font-size="11">7</text>
<line x1="1061.0" y1="720" x2="1061.0" y2="724" stroke="black"/>
<text x="1061.0" y="737" text-anchor="middle" font-size="11">10</text>
<text x="1061.0" y="737" text-anchor="middle" font-size="11">12</text>
<line x1="1218.0" y1="720" x2="1218.0" y2="724" stroke="black"/>
<text x="1218.0" y="737" text-anchor="middle" font-size="11">15</text>
<text x="1218.0" y="737" text-anchor="middle" font-size="11">18</text>
<line x1="1375.0" y1="720" x2="1375.0" y2="724" stroke="black"/>
<text x="1375.0" y="737" text-anchor="middle" font-size="11">20</text>
<text x="1375.0" y="737" text-anchor="middle" font-size="11">24</text>
<line x1="743" y1="720.0" x2="747" y2="720.0" stroke="black"/>
<text x="740" y="724.0" text-anchor="end" font-size="11">0.01</text>
<line x1="743" y1="570.0" x2="747" y2="570.0" stroke="black"/>
@@ -111,12 +121,15 @@
<text x="740" y="124.0" text-anchor="end" font-size="11">100</text>
<text x="1061" y="753" text-anchor="middle" font-size="12">metric line number</text>
<text x="16" y="420" text-anchor="middle" font-size="12" transform="rotate(-90 16 420)">loss (log)</text>
<polyline points="747.0,281.9 780.1,253.6 813.1,243.9 846.2,213.5 879.2,207.6 912.3,386.8 945.3,424.4 978.4,307.1 1011.4,293.6 1044.5,282.6 1077.5,242.7 1110.6,171.4 1143.6,158.6 1176.7,169.7 1209.7,191.2 1242.8,253.6 1275.8,327.8 1308.9,625.2 1341.9,506.4 1375.0,374.2" fill="none" stroke="#1f77b4" stroke-width="1.8" opacity="1.0"/>
<polyline points="747.0,348.9 780.1,307.9 813.1,284.5 846.2,261.3 879.2,244.2 912.3,235.2 945.3,236.5 978.4,241.4 1011.4,270.7 1044.5,292.4 1077.5,378.9 1110.6,302.9 1143.6,277.7 1176.7,264.4 1209.7,254.8 1242.8,246.5 1275.8,242.0 1308.9,251.8 1341.9,262.0 1375.0,273.4" fill="none" stroke="#ff7f0e" stroke-width="1.8" opacity="1.0"/>
<polyline points="747.0,281.9 774.3,253.6 801.6,243.9 828.9,213.5 856.2,207.6 883.5,386.8 910.8,424.4 938.1,307.1 965.4,293.6 992.7,282.6 1020.0,242.7 1047.3,171.4 1074.7,158.6 1102.0,169.7 1129.3,191.2 1156.6,253.6 1183.9,327.8 1211.2,625.2 1238.5,506.4 1265.8,374.2 1293.1,425.9 1320.4,351.1 1347.7,357.9 1375.0,330.0" fill="none" stroke="#1f77b4" stroke-width="1.8" opacity="1.0"/>
<polyline points="747.0,348.9 774.3,307.9 801.6,284.5 828.9,261.3 856.2,244.2 883.5,235.2 910.8,236.5 938.1,241.4 965.4,270.7 992.7,292.4 1020.0,378.9 1047.3,302.9 1074.7,277.7 1102.0,264.4 1129.3,254.8 1156.6,246.5 1183.9,242.0 1211.2,251.8 1238.5,262.0 1265.8,273.4 1293.1,295.3 1320.4,327.5 1347.7,335.9 1375.0,438.0" fill="none" stroke="#ff7f0e" stroke-width="1.8" opacity="1.0"/>
<polyline points="747.0,420.0 774.3,420.1 801.6,420.2 828.9,420.3 856.2,420.3 883.5,420.4 910.8,420.5 938.1,420.5 965.4,420.6 992.7,420.6 1020.0,420.7 1047.3,420.7 1074.7,420.7 1102.0,420.6 1129.3,420.5 1156.6,420.4 1183.9,420.4 1211.2,420.3 1238.5,420.2 1265.8,420.1 1293.1,420.2 1320.4,420.3 1347.7,420.3 1375.0,420.4" fill="none" stroke="#9467bd" stroke-width="1.8" opacity="1.0"/>
<line x1="759" y1="772" x2="787" y2="772" stroke="#1f77b4" stroke-width="3"/>
<text x="793" y="776" font-size="12">critic_loss</text>
<line x1="759" y1="790" x2="787" y2="790" stroke="#ff7f0e" stroke-width="3"/>
<text x="793" y="794" font-size="12">|actor_loss|</text>
<line x1="759" y1="808" x2="787" y2="808" stroke="#9467bd" stroke-width="3"/>
<text x="793" y="812" font-size="12">alpha</text>
<text x="70" y="940" font-size="15" font-weight="bold">Alpha temperature</text>
<text x="70" y="955" font-size="11" fill="#555">training_metrics.jsonl - high = exploring, low = exploiting</text>
<line x1="70" y1="1428.0" x2="697" y2="1428.0" stroke="#dddddd"/>
@@ -129,13 +142,13 @@
<line x1="70.0" y1="1428" x2="70.0" y2="1432" stroke="black"/>
<text x="70.0" y="1445" text-anchor="middle" font-size="11">1</text>
<line x1="226.8" y1="1428" x2="226.8" y2="1432" stroke="black"/>
<text x="226.8" y="1445" text-anchor="middle" font-size="11">6</text>
<text x="226.8" y="1445" text-anchor="middle" font-size="11">7</text>
<line x1="383.5" y1="1428" x2="383.5" y2="1432" stroke="black"/>
<text x="383.5" y="1445" text-anchor="middle" font-size="11">10</text>
<text x="383.5" y="1445" text-anchor="middle" font-size="11">12</text>
<line x1="540.2" y1="1428" x2="540.2" y2="1432" stroke="black"/>
<text x="540.2" y="1445" text-anchor="middle" font-size="11">15</text>
<text x="540.2" y="1445" text-anchor="middle" font-size="11">18</text>
<line x1="697.0" y1="1428" x2="697.0" y2="1432" stroke="black"/>
<text x="697.0" y="1445" text-anchor="middle" font-size="11">20</text>
<text x="697.0" y="1445" text-anchor="middle" font-size="11">24</text>
<line x1="66" y1="1428.0" x2="70" y2="1428.0" stroke="black"/>
<text x="63" y="1432.0" text-anchor="end" font-size="11">0</text>
<line x1="66" y1="1310.5" x2="70" y2="1310.5" stroke="black"/>
@@ -148,7 +161,7 @@
<text x="63" y="962.0" text-anchor="end" font-size="11">1</text>
<text x="383" y="1461" text-anchor="middle" font-size="12">metric line number</text>
<text x="16" y="1193" text-anchor="middle" font-size="12" transform="rotate(-90 16 1193)">alpha</text>
<polyline points="70.0,958.1 103.0,958.7 136.0,959.3 169.0,959.8 202.0,960.4 235.0,961.0 268.0,961.2 301.0,961.5 334.0,962.1 367.0,962.4 400.0,962.9 433.0,963.4 466.0,962.8 499.0,962.3 532.0,961.7 565.0,961.1 598.0,960.6 631.0,960.0 664.0,959.5 697.0,958.9" fill="none" stroke="#9467bd" stroke-width="1.8" opacity="1.0"/>
<polyline points="70.0,958.1 97.3,958.7 124.5,959.3 151.8,959.8 179.0,960.4 206.3,961.0 233.6,961.2 260.8,961.5 288.1,962.1 315.3,962.4 342.6,962.9 369.9,963.4 397.1,962.8 424.4,962.3 451.7,961.7 478.9,961.1 506.2,960.6 533.4,960.0 560.7,959.5 588.0,958.9 615.2,959.3 642.5,959.9 669.7,960.5 697.0,961.0" fill="none" stroke="#9467bd" stroke-width="1.8" opacity="1.0"/>
<text x="747" y="940" font-size="15" font-weight="bold">Throughput - games per hour</text>
<text x="747" y="955" font-size="11" fill="#555">method: training_metrics.jsonl 'epoch' deltas; 1 row = one 10-game chunk</text>
<line x1="747" y1="1428.0" x2="1375" y2="1428.0" stroke="#dddddd"/>
@@ -158,44 +171,28 @@
<line x1="747" y1="958.0" x2="1375" y2="958.0" stroke="#dddddd"/>
<line x1="747" y1="1428" x2="1375" y2="1428" stroke="black"/>
<line x1="747" y1="1428" x2="747" y2="958" stroke="black"/>
<line x1="747.0" y1="1428" x2="747.0" y2="1432" stroke="black"/>
<text x="747.0" y="1445" text-anchor="middle" font-size="11">1</text>
<line x1="781.9" y1="1428" x2="781.9" y2="1432" stroke="black"/>
<text x="781.9" y="1445" text-anchor="middle" font-size="11">2</text>
<line x1="816.8" y1="1428" x2="816.8" y2="1432" stroke="black"/>
<text x="816.8" y="1445" text-anchor="middle" font-size="11">3</text>
<line x1="851.7" y1="1428" x2="851.7" y2="1432" stroke="black"/>
<text x="851.7" y="1445" text-anchor="middle" font-size="11">4</text>
<line x1="886.6" y1="1428" x2="886.6" y2="1432" stroke="black"/>
<text x="886.6" y="1445" text-anchor="middle" font-size="11">5</text>
<line x1="921.4" y1="1428" x2="921.4" y2="1432" stroke="black"/>
<text x="921.4" y="1445" text-anchor="middle" font-size="11">6</text>
<line x1="956.3" y1="1428" x2="956.3" y2="1432" stroke="black"/>
<text x="956.3" y="1445" text-anchor="middle" font-size="11">7</text>
<line x1="991.2" y1="1428" x2="991.2" y2="1432" stroke="black"/>
<text x="991.2" y="1445" text-anchor="middle" font-size="11">8</text>
<line x1="1026.1" y1="1428" x2="1026.1" y2="1432" stroke="black"/>
<text x="1026.1" y="1445" text-anchor="middle" font-size="11">9</text>
<line x1="775.5" y1="1428" x2="775.5" y2="1432" stroke="black"/>
<text x="775.5" y="1445" text-anchor="middle" font-size="11">2</text>
<line x1="832.6" y1="1428" x2="832.6" y2="1432" stroke="black"/>
<text x="832.6" y="1445" text-anchor="middle" font-size="11">4</text>
<line x1="889.7" y1="1428" x2="889.7" y2="1432" stroke="black"/>
<text x="889.7" y="1445" text-anchor="middle" font-size="11">6</text>
<line x1="946.8" y1="1428" x2="946.8" y2="1432" stroke="black"/>
<text x="946.8" y="1445" text-anchor="middle" font-size="11">8</text>
<line x1="1003.9" y1="1428" x2="1003.9" y2="1432" stroke="black"/>
<text x="1003.9" y="1445" text-anchor="middle" font-size="11">10</text>
<line x1="1061.0" y1="1428" x2="1061.0" y2="1432" stroke="black"/>
<text x="1061.0" y="1445" text-anchor="middle" font-size="11">10</text>
<line x1="1095.9" y1="1428" x2="1095.9" y2="1432" stroke="black"/>
<text x="1095.9" y="1445" text-anchor="middle" font-size="11">11</text>
<line x1="1130.8" y1="1428" x2="1130.8" y2="1432" stroke="black"/>
<text x="1130.8" y="1445" text-anchor="middle" font-size="11">12</text>
<line x1="1165.7" y1="1428" x2="1165.7" y2="1432" stroke="black"/>
<text x="1165.7" y="1445" text-anchor="middle" font-size="11">13</text>
<line x1="1200.6" y1="1428" x2="1200.6" y2="1432" stroke="black"/>
<text x="1200.6" y="1445" text-anchor="middle" font-size="11">14</text>
<line x1="1235.4" y1="1428" x2="1235.4" y2="1432" stroke="black"/>
<text x="1235.4" y="1445" text-anchor="middle" font-size="11">15</text>
<line x1="1270.3" y1="1428" x2="1270.3" y2="1432" stroke="black"/>
<text x="1270.3" y="1445" text-anchor="middle" font-size="11">16</text>
<line x1="1305.2" y1="1428" x2="1305.2" y2="1432" stroke="black"/>
<text x="1305.2" y="1445" text-anchor="middle" font-size="11">17</text>
<line x1="1340.1" y1="1428" x2="1340.1" y2="1432" stroke="black"/>
<text x="1340.1" y="1445" text-anchor="middle" font-size="11">18</text>
<line x1="1375.0" y1="1428" x2="1375.0" y2="1432" stroke="black"/>
<text x="1375.0" y="1445" text-anchor="middle" font-size="11">19</text>
<text x="1061.0" y="1445" text-anchor="middle" font-size="11">12</text>
<line x1="1118.1" y1="1428" x2="1118.1" y2="1432" stroke="black"/>
<text x="1118.1" y="1445" text-anchor="middle" font-size="11">14</text>
<line x1="1175.2" y1="1428" x2="1175.2" y2="1432" stroke="black"/>
<text x="1175.2" y="1445" text-anchor="middle" font-size="11">16</text>
<line x1="1232.3" y1="1428" x2="1232.3" y2="1432" stroke="black"/>
<text x="1232.3" y="1445" text-anchor="middle" font-size="11">18</text>
<line x1="1289.4" y1="1428" x2="1289.4" y2="1432" stroke="black"/>
<text x="1289.4" y="1445" text-anchor="middle" font-size="11">20</text>
<line x1="1346.5" y1="1428" x2="1346.5" y2="1432" stroke="black"/>
<text x="1346.5" y="1445" text-anchor="middle" font-size="11">22</text>
<line x1="743" y1="1428.0" x2="747" y2="1428.0" stroke="black"/>
<text x="740" y="1432.0" text-anchor="end" font-size="11">0</text>
<line x1="743" y1="1310.5" x2="747" y2="1310.5" stroke="black"/>
@@ -209,25 +206,29 @@
<text x="1061" y="1461" text-anchor="middle" font-size="12">chunk interval (10-game chunks)</text>
<text x="16" y="1193" text-anchor="middle" font-size="12" transform="rotate(-90 16 1193)">games / hour</text>
<circle cx="747.0" cy="1159.8" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="781.9" cy="1413.4" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="816.8" cy="1148.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="851.7" cy="1404.7" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="886.6" cy="1153.6" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="921.4" cy="1399.6" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="956.3" cy="1000.7" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="991.2" cy="1399.5" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1026.1" cy="1021.4" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1061.0" cy="1394.8" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1095.9" cy="1376.2" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1130.8" cy="1394.4" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1165.7" cy="1130.1" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1200.6" cy="1399.7" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1235.4" cy="1176.5" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1270.3" cy="1402.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1305.2" cy="1158.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1340.1" cy="1400.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1375.0" cy="1149.2" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<polyline points="747.0,1159.8 781.9,1413.4 781.9,1148.0 851.7,1404.7 851.7,1153.6 921.4,1399.6 921.4,1000.7 991.2,1399.5 991.2,1021.4 1061.0,1394.8 1061.0,1376.2 1130.8,1394.4 1130.8,1130.1 1200.6,1399.7 1200.6,1176.5 1270.3,1402.0 1270.3,1158.0 1340.1,1400.0 1340.1,1149.2" fill="none" stroke="#2ca02c" stroke-width="3.5" opacity="1.0"/>
<circle cx="775.5" cy="1413.4" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="804.1" cy="1148.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="832.6" cy="1404.7" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="861.2" cy="1153.6" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="889.7" cy="1399.6" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="918.3" cy="1000.7" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="946.8" cy="1399.5" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="975.4" cy="1021.4" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1003.9" cy="1394.8" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1032.5" cy="1376.2" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1061.0" cy="1394.4" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1089.5" cy="1130.1" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1118.1" cy="1399.7" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1146.6" cy="1176.5" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1175.2" cy="1402.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1203.7" cy="1158.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1232.3" cy="1400.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1260.8" cy="1149.2" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1289.4" cy="1400.6" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1317.9" cy="1171.7" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1346.5" cy="1405.2" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1375.0" cy="1162.2" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<polyline points="747.0,1286.6 775.5,1276.3 804.1,1276.6 832.6,1000.7 861.2,1399.5 889.7,1021.4 918.3,1394.8 975.4,1376.2 1003.9,1394.4 1032.5,1130.1 1061.0,1399.7 1089.5,1176.5 1118.1,1402.0 1175.2,1158.0 1203.7,1400.0 1232.3,1149.2 1260.8,1400.6 1289.4,1171.7 1317.9,1405.2 1346.5,1162.2" fill="none" stroke="#2ca02c" stroke-width="3.5" opacity="1.0"/>
<rect x="0" y="1540" width="1400" height="180" fill="#f2f2f2"/>
<text x="16" y="1561" font-size="15" font-weight="bold">How to read</text>
<text x="1384" y="1560" text-anchor="end" font-size="11" fill="#666">Regenerate anytime: python3 tools/plot_progress.py</text>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 19 KiB

+15 -9
View File
@@ -5,7 +5,7 @@ Pure-stdlib SVG output (matplotlib not available on this box).
Generates ONE file:
docs/campaign_dashboard.svg - four panels, current (v2) run only:
1. test-match win % vs opponents (campaign_v4_stdout.log eval lines)
2. critic_loss / |actor_loss| (training_metrics.jsonl, shared log-y)
2. critic_loss / |actor_loss| / alpha (training_metrics.jsonl, shared log-y)
3. alpha temperature (training_metrics.jsonl, linear)
4. throughput, games/hour buckets (training_metrics.jsonl 'epoch' deltas;
1 metrics row == one 10-game chunk,
@@ -36,6 +36,7 @@ GAMES_PER_ROW = 10 # one training_metrics.jsonl row per 10-round chunk
COLORS = {"Corners": "#d62728", "Crazy": "#1f77b4", "Target": "#2ca02c",
"RamFire": "#ff7f0e", "SacTwin": "#9467bd"}
CRITIC_C, ACTOR_C = "#1f77b4", "#ff7f0e"
ALPHA_C = "#9467bd" # same purple as the dedicated alpha panel
RELOAD_JS = ('<script type="text/javascript"><![CDATA[ '
'setTimeout(function(){ location.reload(); }, 60000); ]]></script>')
W, H = 1400, 1720
@@ -51,7 +52,7 @@ ROWS = {
}
PANEL_TITLES = [
"Test matches - win % vs opponents",
"Training losses (log scale)",
"Training losses & alpha (log scale)",
"Alpha temperature",
"Throughput - games per hour",
]
@@ -285,11 +286,12 @@ def panel_losses(rows, geo):
critic = metric_col(rows, "critic_loss", positive=True)
actor = metric_col(rows, "actor_loss") # abs() applied; sign dropped
actor = [(i, v) for i, v in actor if v > 0]
if not (critic or actor):
alpha = metric_col(rows, "alpha")
if not (critic or actor or alpha):
s += f'<text x="{x0 + 10}" y="{pt + 40}" font-size="12" fill="#a00">' \
"no valid loss points</text>\n"
return
allv = [v for _, v in critic + actor]
allv = [v for _, v in critic + actor + alpha]
lo, hi = math.floor(math.log10(min(allv))), math.ceil(math.log10(max(allv)))
if lo == hi:
hi = lo + 1
@@ -301,8 +303,11 @@ def panel_losses(rows, geo):
ticks_log(lo, hi, pb, pt), "metric line number", "loss (log)")
s += polyline([(xm(i), ym(v)) for i, v in critic], CRITIC_C, 1.8)
s += polyline([(xm(i), ym(v)) for i, v in actor], ACTOR_C, 1.8)
s += legend([(CRITIC_C, "critic_loss"), (ACTOR_C, "|actor_loss|")],
x0 + 12, pb + 52)
s += polyline([(xm(i), ym(v)) for i, v in alpha], ALPHA_C, 1.8)
items = [(CRITIC_C, "critic_loss"), (ACTOR_C, "|actor_loss|")]
if alpha:
items.append((ALPHA_C, "alpha"))
s += legend(items, x0 + 12, pb + 52)
return s
def panel_alpha(rows, geo):
@@ -435,14 +440,15 @@ def selftest():
ET.fromstring(text) # whole doc must parse -> closing tag present
assert RELOAD_JS in text, "auto-reload script missing"
for t in PANEL_TITLES:
assert t in text, f"panel title missing: {t}"
assert esc(t) in text, f"panel title missing: {t}"
assert text.count(PANEL_TITLES[0]) == 1
assert "How to read" in text, "reading guide missing"
assert 'width="1400"' in text and 'height="1720"' in text
# circles: 4 eval dots (panel 1) + 2 throughput rate dots (panel 4)
assert text.count("<circle") == 6, text.count("<circle")
# 2 trends + 2 losses + 1 alpha + 1 throughput
assert text.count("<polyline") == 6, text.count("<polyline")
# 2 trends + 3 losses-panel polylines (critic, actor, alpha)
# + 1 dedicated alpha panel + 1 throughput
assert text.count("<polyline") == 7, text.count("<polyline")
# orientation guard: a known rising series (10% -> 90%) rendered through
# the FULL build path must plot upward (smaller SVG y) and forward in