From 5687435f84423fd462b65a23b0d6bc06592af8db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=8B=9C=EC=9B=90?= Date: Thu, 7 May 2026 17:11:34 +0900 Subject: [PATCH] Prefix iteration-scoped log lines with [i=N] Make traversal progress and iteration-complete summary lines easier to visually scan during long runs by leading with [i=N]. Drop the redundant "iteration=N" kv from the body to keep lines short. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../games/classic/deep_cfr/trainer.py | 11 +++++------ tests/games/classic/test_deep_cfr_trainer.py | 3 ++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/coolrl_lost_cities/games/classic/deep_cfr/trainer.py b/src/coolrl_lost_cities/games/classic/deep_cfr/trainer.py index a127947..894ee53 100644 --- a/src/coolrl_lost_cities/games/classic/deep_cfr/trainer.py +++ b/src/coolrl_lost_cities/games/classic/deep_cfr/trainer.py @@ -131,8 +131,7 @@ class IterationMetrics: def _format_iteration_summary(metrics: IterationMetrics, data: dict[str, float | int]) -> str: parts = [ - "Iteration complete:", - f"iteration={metrics.iteration}", + f"[i={metrics.iteration}] Iteration complete", f"traversal_nodes={metrics.traversal_nodes}", f"nodes_per_second={_format_summary_value(data['nodes_per_second'])}", f"advantage_loss={_format_summary_value(metrics.advantage_loss)}", @@ -422,7 +421,7 @@ class DeepCFRTrainer: if progress_every > 0 and completed >= progress_every: elapsed = time.perf_counter() - progress_started self.tracker.log_event( - f"Traversal progress iteration={iteration} completed={completed} " + f"[i={iteration}] Traversal progress completed={completed} " f"elapsed_seconds={elapsed:.2f} total_nodes={total_stats.nodes} " f"nodes_per_second={total_stats.nodes / max(elapsed, 1.0e-12):.1f}" ) @@ -436,13 +435,13 @@ class DeepCFRTrainer: requested_workers = self.config.traversal.resolved_num_workers() max_workers = self.config.traversal.resolved_num_workers(len(batches)) self.tracker.log_event( - f"Traversal multiprocessing enabled iteration={iteration} " + f"[i={iteration}] Traversal multiprocessing enabled " f"requested_workers={requested_workers} effective_workers={max_workers} " f"batches={len(batches)} chunk_size={self.config.traversal.worker_chunk_size}" ) if max_workers < requested_workers: self.tracker.log_event( - f"Traversal worker count capped iteration={iteration} " + f"[i={iteration}] Traversal worker count capped " f"requested_workers={requested_workers} effective_workers={max_workers} " f"available_batches={len(batches)}" ) @@ -482,7 +481,7 @@ class DeepCFRTrainer: if next_progress_at is not None and progress_traversals >= next_progress_at: elapsed = time.perf_counter() - progress_started self.tracker.log_event( - f"Traversal multiprocessing progress iteration={iteration} " + f"[i={iteration}] Traversal multiprocessing progress " f"completed_batches={completed_batches}/{total_batches} " f"completed_traversals={progress_traversals} " f"elapsed_seconds={elapsed:.2f} " diff --git a/tests/games/classic/test_deep_cfr_trainer.py b/tests/games/classic/test_deep_cfr_trainer.py index 5237ee2..425af4c 100644 --- a/tests/games/classic/test_deep_cfr_trainer.py +++ b/tests/games/classic/test_deep_cfr_trainer.py @@ -666,7 +666,8 @@ def test_deep_cfr_trainer_saves_loads_and_evaluates_checkpoint(tmp_path) -> None assert (checkpoint_dir / "train.log").exists() train_log = (checkpoint_dir / "train.log").read_text(encoding="utf-8") assert re.search(r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}", train_log) - assert "Iteration complete:" in train_log + assert "Iteration complete" in train_log + assert "[i=1]" in train_log assert "reservoir memories and RNG state are not restored" in train_log assert restored.iteration == 1 assert "eval_random_games" in metrics[0].eval_metrics