From 51e7f33ecb0a0fab2d930092a33ec645ee27f6ed Mon Sep 17 00:00:00 2001 From: Davide Cappellini Date: Mon, 24 Aug 2026 08:30:04 +0200 Subject: [PATCH] fix(dashboard): plot live campaign-4 logs; derive ROOT from script location --- SAC_LSTM_Bot/docs/campaign_dashboard.svg | 683 +++-------------------- SAC_LSTM_Bot/tools/plot_progress.py | 4 +- 2 files changed, 78 insertions(+), 609 deletions(-) diff --git a/SAC_LSTM_Bot/docs/campaign_dashboard.svg b/SAC_LSTM_Bot/docs/campaign_dashboard.svg index acc6b24..9c5967d 100644 --- a/SAC_LSTM_Bot/docs/campaign_dashboard.svg +++ b/SAC_LSTM_Bot/docs/campaign_dashboard.svg @@ -1,7 +1,7 @@ SAC-LSTM campaign dashboard - live run (current only) -generated 2026-08-23 10:46:52 - auto-reloads every 60 s (open this file in Chrome) +generated 2026-08-24 08:29:26 - auto-reloads every 60 s (open this file in Chrome) Test matches - win % vs opponents raw dots = single test matches, thick = rolling-mean-10 @@ -12,24 +12,18 @@ - -10 - -20 - -30 - -40 - -50 - -60 - -70 - -80 - -90 + +1 + +2 + +3 + +4 + +5 + +6 0 @@ -45,308 +39,31 @@ test match number (each opponent) win rate (%) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + -Corners - 98 evals +Corners - 6 evals -Crazy - 98 evals +Crazy - 6 evals -Target - 98 evals +Target - 5 evals Real fights - win % per opponent training_log.jsonl only - learning in REAL battles, not tests @@ -357,18 +74,6 @@ - -300 - -600 - -900 - -1200 - -1500 - -1800 0 @@ -383,74 +88,43 @@ 100 game number (100-game buckets) win % - - - - - - - - - - - - -Crazy (470 games) - -RamFire (450 games) - -Target (220 games) - -SacTwin (190 games) - -Corners (670 games) + +RamFire (10 games) + +Target (10 games) + +Corners (40 games) Training losses (log scale) training_metrics.jsonl - big early spikes are normal - - - - - - - - - - - - - - - - 1 -51 +2 -101 +4 -151 +5 -201 +6 -0.1 +1 -3.16e+03 +3.16 -1e+08 +10 -3.16e+12 +31.6 -1e+17 +100 metric line number loss (log) - - + + critic_loss @@ -467,26 +141,26 @@ 1 -51 +2 -101 +4 -151 +5 -201 +6 0 -0.252 +0.25 -0.504 +0.5 -0.756 +0.75 -1.01 +1 metric line number alpha - + Throughput - games per hour method: training_metrics.jsonl 'epoch' deltas (training_log.jsonl has no timestamps); 1 row = one 10-game chunk @@ -496,239 +170,34 @@ - -20 - -40 - -60 - -80 - -100 - -120 - -140 - -160 - -180 + +1 + +2 + +3 + +4 -200 +5 0 -1688 +70 -3375 +141 -5063 +211 -6750 +282 chunk interval (10-game chunks) games / hour - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + How to read Regenerate anytime: python3 tools/plot_progress.py diff --git a/SAC_LSTM_Bot/tools/plot_progress.py b/SAC_LSTM_Bot/tools/plot_progress.py index b3d5df3..da040e7 100644 --- a/SAC_LSTM_Bot/tools/plot_progress.py +++ b/SAC_LSTM_Bot/tools/plot_progress.py @@ -4,7 +4,7 @@ Pure-stdlib SVG output (matplotlib not available on this box). Generates ONE file: docs/campaign_dashboard.svg - five panels, current (v2) run only: - 1. test-match win % vs opponents (campaign_v2_stdout.log eval lines) + 1. test-match win % vs opponents (campaign_v4_stdout.log eval lines) 2. real-fight win % per opponent (training_log.jsonl, ~100-game buckets) 3. critic_loss / |actor_loss| (training_metrics.jsonl, shared log-y) 4. alpha temperature (training_metrics.jsonl, linear) @@ -556,7 +556,7 @@ def main(): selftest() return args = [a for a in sys.argv[1:] if not a.startswith("-")] - campaign = Path(args[0]) if len(args) > 0 else ROOT / "campaign_v2_stdout.log" + campaign = Path(args[0]) if len(args) > 0 else ROOT / "campaign_v4_stdout.log" metrics = Path(args[1]) if len(args) > 1 else ROOT / "training_metrics.jsonl" games = Path(args[2]) if len(args) > 2 else ROOT / "training_log.jsonl" outdir = Path(args[3]) if len(args) > 3 else ROOT / "docs"