Files
SirRoboGarage/SAC_LSTM_Bot/docs/campaign_dashboard.svg
T

213 lines
16 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" width="1400" height="2000" viewBox="0 0 1400 2000" font-family="sans-serif">
<rect width="1400" height="2000" 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 08:29:26 - 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"/>
<line x1="70" y1="600.0" x2="697" y2="600.0" stroke="#dddddd"/>
<line x1="70" y1="480.0" x2="697" y2="480.0" stroke="#dddddd"/>
<line x1="70" y1="360.0" x2="697" y2="360.0" stroke="#dddddd"/>
<line x1="70" y1="240.0" x2="697" y2="240.0" stroke="#dddddd"/>
<line x1="70" y1="120.0" x2="697" y2="120.0" stroke="#dddddd"/>
<line x1="70" y1="720" x2="697" y2="720" stroke="black"/>
<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="195.4" y1="720" x2="195.4" y2="724" stroke="black"/>
<text x="195.4" y="737" text-anchor="middle" font-size="11">2</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">3</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">4</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">5</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">6</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"/>
<text x="63" y="604.0" text-anchor="end" font-size="11">20</text>
<line x1="66" y1="480.0" x2="70" y2="480.0" stroke="black"/>
<text x="63" y="484.0" text-anchor="end" font-size="11">40</text>
<line x1="66" y1="360.0" x2="70" y2="360.0" stroke="black"/>
<text x="63" y="364.0" text-anchor="end" font-size="11">60</text>
<line x1="66" y1="240.0" x2="70" y2="240.0" stroke="black"/>
<text x="63" y="244.0" text-anchor="end" font-size="11">80</text>
<line x1="66" y1="120.0" x2="70" y2="120.0" stroke="black"/>
<text x="63" y="124.0" text-anchor="end" font-size="11">100</text>
<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="195.4" 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="446.2" 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="697.0" cy="720.0" r="2" fill="#d62728" opacity="0.25"/>
<polyline points="70.0,720.0 195.4,720.0 320.8,720.0 446.2,720.0 571.6,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="195.4" 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="446.2" 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="697.0" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/>
<polyline points="70.0,720.0 195.4,720.0 320.8,720.0 446.2,720.0 571.6,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="195.4" 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="446.2" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="571.6" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/>
<polyline points="70.0,720.0 195.4,720.0 320.8,720.0 446.2,720.0 571.6,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 - 6 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 - 6 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 - 5 evals</text>
<text x="747" y="100" font-size="15" font-weight="bold">Real fights - win % per opponent</text>
<text x="747" y="115" font-size="11" fill="#555">training_log.jsonl only - learning in REAL battles, not tests</text>
<line x1="747" y1="720.0" x2="1375" y2="720.0" stroke="#dddddd"/>
<line x1="747" y1="600.0" x2="1375" y2="600.0" stroke="#dddddd"/>
<line x1="747" y1="480.0" x2="1375" y2="480.0" stroke="#dddddd"/>
<line x1="747" y1="360.0" x2="1375" y2="360.0" stroke="#dddddd"/>
<line x1="747" y1="240.0" x2="1375" y2="240.0" stroke="#dddddd"/>
<line x1="747" y1="120.0" x2="1375" y2="120.0" stroke="#dddddd"/>
<line x1="747" y1="720" x2="1375" y2="720" stroke="black"/>
<line x1="747" y1="720" x2="747" y2="120" stroke="black"/>
<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</text>
<line x1="743" y1="600.0" x2="747" y2="600.0" stroke="black"/>
<text x="740" y="604.0" text-anchor="end" font-size="11">20</text>
<line x1="743" y1="480.0" x2="747" y2="480.0" stroke="black"/>
<text x="740" y="484.0" text-anchor="end" font-size="11">40</text>
<line x1="743" y1="360.0" x2="747" y2="360.0" stroke="black"/>
<text x="740" y="364.0" text-anchor="end" font-size="11">60</text>
<line x1="743" y1="240.0" x2="747" y2="240.0" stroke="black"/>
<text x="740" y="244.0" text-anchor="end" font-size="11">80</text>
<line x1="743" y1="120.0" x2="747" y2="120.0" stroke="black"/>
<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">game number (100-game buckets)</text>
<text x="16" y="420" text-anchor="middle" font-size="12" transform="rotate(-90 16 420)">win %</text>
<line x1="759" y1="772" x2="787" y2="772" stroke="#ff7f0e" stroke-width="3"/>
<text x="793" y="776" font-size="12">RamFire (10 games)</text>
<line x1="759" y1="790" x2="787" y2="790" stroke="#2ca02c" stroke-width="3"/>
<text x="793" y="794" font-size="12">Target (10 games)</text>
<line x1="759" y1="808" x2="787" y2="808" stroke="#d62728" stroke-width="3"/>
<text x="793" y="812" font-size="12">Corners (40 games)</text>
<text x="70" y="940" font-size="15" font-weight="bold">Training losses (log scale)</text>
<text x="70" y="955" font-size="11" fill="#555">training_metrics.jsonl - big early spikes are normal</text>
<line x1="70" y1="1428.0" x2="697" y2="1428.0" stroke="#dddddd"/>
<line x1="70" y1="1193.0" x2="697" y2="1193.0" stroke="#dddddd"/>
<line x1="70" y1="958.0" x2="697" y2="958.0" stroke="#dddddd"/>
<line x1="70" y1="1428" x2="697" y2="1428" stroke="black"/>
<line x1="70" y1="1428" x2="70" y2="958" stroke="black"/>
<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">2</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">4</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">5</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">6</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">1</text>
<line x1="66" y1="1310.5" x2="70" y2="1310.5" stroke="black"/>
<text x="63" y="1314.5" text-anchor="end" font-size="11">3.16</text>
<line x1="66" y1="1193.0" x2="70" y2="1193.0" stroke="black"/>
<text x="63" y="1197.0" text-anchor="end" font-size="11">10</text>
<line x1="66" y1="1075.5" x2="70" y2="1075.5" stroke="black"/>
<text x="63" y="1079.5" text-anchor="end" font-size="11">31.6</text>
<line x1="66" y1="958.0" x2="70" y2="958.0" stroke="black"/>
<text x="63" y="962.0" text-anchor="end" font-size="11">100</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)">loss (log)</text>
<polyline points="70.0,1389.5 195.4,1170.1 320.8,1142.9 446.2,1123.8 571.6,1120.3 697.0,1282.3" fill="none" stroke="#1f77b4" stroke-width="1.8" opacity="1.0"/>
<polyline points="70.0,1309.7 195.4,1276.0 320.8,1242.6 446.2,1202.8 571.6,1159.7 697.0,1139.0" fill="none" stroke="#ff7f0e" stroke-width="1.8" opacity="1.0"/>
<line x1="82" y1="1480" x2="110" y2="1480" stroke="#1f77b4" stroke-width="3"/>
<text x="116" y="1484" font-size="12">critic_loss</text>
<line x1="82" y1="1498" x2="110" y2="1498" stroke="#ff7f0e" stroke-width="3"/>
<text x="116" y="1502" font-size="12">|actor_loss|</text>
<text x="747" y="940" font-size="15" font-weight="bold">Alpha temperature</text>
<text x="747" y="955" font-size="11" fill="#555">training_metrics.jsonl - high = exploring, low = exploiting</text>
<line x1="747" y1="1428.0" x2="1375" y2="1428.0" stroke="#dddddd"/>
<line x1="747" y1="1310.5" x2="1375" y2="1310.5" stroke="#dddddd"/>
<line x1="747" y1="1193.0" x2="1375" y2="1193.0" stroke="#dddddd"/>
<line x1="747" y1="1075.5" x2="1375" y2="1075.5" stroke="#dddddd"/>
<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="904.0" y1="1428" x2="904.0" y2="1432" stroke="black"/>
<text x="904.0" y="1445" text-anchor="middle" font-size="11">2</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">4</text>
<line x1="1218.0" y1="1428" x2="1218.0" y2="1432" stroke="black"/>
<text x="1218.0" y="1445" text-anchor="middle" font-size="11">5</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">6</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"/>
<text x="740" y="1314.5" text-anchor="end" font-size="11">0.25</text>
<line x1="743" y1="1193.0" x2="747" y2="1193.0" stroke="black"/>
<text x="740" y="1197.0" text-anchor="end" font-size="11">0.5</text>
<line x1="743" y1="1075.5" x2="747" y2="1075.5" stroke="black"/>
<text x="740" y="1079.5" text-anchor="end" font-size="11">0.75</text>
<line x1="743" y1="958.0" x2="747" y2="958.0" stroke="black"/>
<text x="740" y="962.0" text-anchor="end" font-size="11">1</text>
<text x="1061" 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="747.0,958.1 872.6,958.4 998.2,959.0 1123.8,959.6 1249.4,960.1 1375.0,960.7" fill="none" stroke="#9467bd" stroke-width="1.8" opacity="1.0"/>
<text x="70" y="1600" font-size="15" font-weight="bold">Throughput - games per hour</text>
<text x="70" y="1615" font-size="11" fill="#555">method: training_metrics.jsonl 'epoch' deltas (training_log.jsonl has no timestamps); 1 row = one 10-game chunk</text>
<line x1="70" y1="1780.0" x2="1375" y2="1780.0" stroke="#dddddd"/>
<line x1="70" y1="1739.5" x2="1375" y2="1739.5" stroke="#dddddd"/>
<line x1="70" y1="1699.0" x2="1375" y2="1699.0" stroke="#dddddd"/>
<line x1="70" y1="1658.5" x2="1375" y2="1658.5" stroke="#dddddd"/>
<line x1="70" y1="1618.0" x2="1375" y2="1618.0" stroke="#dddddd"/>
<line x1="70" y1="1780" x2="1375" y2="1780" stroke="black"/>
<line x1="70" y1="1780" x2="70" y2="1618" stroke="black"/>
<line x1="70.0" y1="1780" x2="70.0" y2="1784" stroke="black"/>
<text x="70.0" y="1797" text-anchor="middle" font-size="11">1</text>
<line x1="396.2" y1="1780" x2="396.2" y2="1784" stroke="black"/>
<text x="396.2" y="1797" text-anchor="middle" font-size="11">2</text>
<line x1="722.5" y1="1780" x2="722.5" y2="1784" stroke="black"/>
<text x="722.5" y="1797" text-anchor="middle" font-size="11">3</text>
<line x1="1048.8" y1="1780" x2="1048.8" y2="1784" stroke="black"/>
<text x="1048.8" y="1797" text-anchor="middle" font-size="11">4</text>
<line x1="1375.0" y1="1780" x2="1375.0" y2="1784" stroke="black"/>
<text x="1375.0" y="1797" text-anchor="middle" font-size="11">5</text>
<line x1="66" y1="1780.0" x2="70" y2="1780.0" stroke="black"/>
<text x="63" y="1784.0" text-anchor="end" font-size="11">0</text>
<line x1="66" y1="1739.5" x2="70" y2="1739.5" stroke="black"/>
<text x="63" y="1743.5" text-anchor="end" font-size="11">70</text>
<line x1="66" y1="1699.0" x2="70" y2="1699.0" stroke="black"/>
<text x="63" y="1703.0" text-anchor="end" font-size="11">141</text>
<line x1="66" y1="1658.5" x2="70" y2="1658.5" stroke="black"/>
<text x="63" y="1662.5" text-anchor="end" font-size="11">211</text>
<line x1="66" y1="1618.0" x2="70" y2="1618.0" stroke="black"/>
<text x="63" y="1622.0" text-anchor="end" font-size="11">282</text>
<text x="722" y="1813" text-anchor="middle" font-size="12">chunk interval (10-game chunks)</text>
<text x="16" y="1699" text-anchor="middle" font-size="12" transform="rotate(-90 16 1699)">games / hour</text>
<circle cx="70.0" cy="1650.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="396.2" cy="1650.1" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="722.5" cy="1673.4" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1048.8" cy="1648.9" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="1375.0" cy="1632.7" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<polyline points="70.0,1650.0 396.2,1650.1 396.2,1673.4 1048.8,1648.9 1048.8,1632.7" fill="none" stroke="#2ca02c" stroke-width="3.5" opacity="1.0"/>
<rect x="0" y="1820" width="1400" height="180" fill="#f2f2f2"/>
<text x="16" y="1841" font-size="15" font-weight="bold">How to read</text>
<text x="1384" y="1840" text-anchor="end" font-size="11" fill="#666">Regenerate anytime: python3 tools/plot_progress.py</text>
<text x="16" y="1863" font-size="13">Test matches: dots are single fights, thick line shows trend.</text>
<text x="16" y="1880" font-size="13">Real battles only. Rising lines mean the bot improves.</text>
<text x="16" y="1897" font-size="13">Loss spikes are normal early; endless growth is bad.</text>
<text x="16" y="1914" font-size="13">Alpha high means experimenting; falling too fast freezes habits.</text>
<text x="16" y="1931" font-size="13">Throughput flat is healthy; dips mean something slowed.</text>
<text x="16" y="1948" font-size="13">This file reloads itself in Chrome every sixty seconds.</text>
<text x="16" y="1965" font-size="13">Regenerate anytime with tools/watch_dashboard.sh or the python command.</text>
<script type="text/javascript"><![CDATA[ setTimeout(function(){ location.reload(); }, 60000); ]]></script>
</svg>