diff --git a/AGENTS.md b/AGENTS.md index 99c9569..4b30dd3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,7 +8,13 @@ project environment and Cython extensions are built/loaded consistently. - `src/coolrl_lost_cities/games/classic/game.pyx`: Cython Lost Cities engine. - `src/coolrl_lost_cities/games/classic/deep_cfr/`: Deep CFR training, traversal, evaluation, analysis, and CLI code. -- `configs/deep_cfr/`: Deep CFR YAML configs (kebab-case filenames). +- `configs/deep_cfr/`: active Deep CFR YAML configs (kebab-case filenames). + Currently holds two: + - `default.yaml`: the canonical "best-known" baseline. Start here, then + override fields via `--set` for experiments/ablations. + - `smoke.yaml`: 1-iter sanity check for the training loop. +- `configs/archive/`: retired/historical configs. Don't modify; reference + if you need to reproduce an old run. - `runs/`: generated training runs. Gitignored, may be a symlink to larger storage. Layout: - `runs/archive/`: past runs. **Do not modify or delete.** @@ -67,28 +73,28 @@ Real experiment (lands in `runs/`): ```bash uv run lost-cities-deep-cfr train \ - --config configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability.yaml \ + --config configs/deep_cfr/default.yaml \ --keep -# → runs/_lost-cities-deep-cfr-selfplay-full-depth-slot-playability/ +# → runs/_deep-cfr-default/ ``` -Variant of the same config (override slug): +Variant / ablation (override one field; keep slug informative): ```bash uv run lost-cities-deep-cfr train \ - --config configs/deep_cfr/deep-cfr-color-shared-attention-512x3.yaml \ + --config configs/deep_cfr/default.yaml \ --keep \ - --set run.experiment_name=color-attn-v2 -# → runs/_color-attn-v2/ + --set training_weighting.mode=none \ + --set run.experiment_name=ablation-no-lcfr +# → runs/_ablation-no-lcfr/ ``` Short fixed-iteration run: ```bash uv run lost-cities-deep-cfr train \ - --config configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability.yaml \ + --config configs/deep_cfr/default.yaml \ --set run.max_iterations=100 \ - --set run.max_minutes=null \ --set checkpoint.save_every=0 ``` @@ -96,7 +102,7 @@ Resume (path required, no shortcut): ```bash uv run lost-cities-deep-cfr train \ - --config configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability.yaml \ + --config configs/deep_cfr/default.yaml \ --resume runs/_/latest.pt ``` @@ -142,7 +148,9 @@ Start a long unbounded run: tmux new-session -s coolrl-deepcfr-unbounded \ -c /home/coolguy/dev/coolrl-lost-cities \ 'uv run lost-cities-deep-cfr train \ - --config configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability-unbounded.yaml \ + --config configs/deep_cfr/default.yaml \ + --set run.max_iterations=null \ + --set run.max_minutes=null \ --keep' ``` diff --git a/configs/deep_cfr/deep-cfr-color-shared-512x3.yaml b/configs/archive/deep-cfr-color-shared-512x3.yaml similarity index 100% rename from configs/deep_cfr/deep-cfr-color-shared-512x3.yaml rename to configs/archive/deep-cfr-color-shared-512x3.yaml diff --git a/configs/deep_cfr/deep-cfr-color-shared-attention-512x3.yaml b/configs/archive/deep-cfr-color-shared-attention-512x3.yaml similarity index 100% rename from configs/deep_cfr/deep-cfr-color-shared-attention-512x3.yaml rename to configs/archive/deep-cfr-color-shared-attention-512x3.yaml diff --git a/configs/deep_cfr/deep-cfr-color-shared-attention-exp-1000iter.yaml b/configs/archive/deep-cfr-color-shared-attention-exp-1000iter.yaml similarity index 100% rename from configs/deep_cfr/deep-cfr-color-shared-attention-exp-1000iter.yaml rename to configs/archive/deep-cfr-color-shared-attention-exp-1000iter.yaml diff --git a/configs/deep_cfr/deep-cfr-opponent-network-1024x4-1000iter.yaml b/configs/archive/deep-cfr-opponent-network-1024x4-1000iter.yaml similarity index 100% rename from configs/deep_cfr/deep-cfr-opponent-network-1024x4-1000iter.yaml rename to configs/archive/deep-cfr-opponent-network-1024x4-1000iter.yaml diff --git a/configs/deep_cfr/deep-cfr-opponent-network-512x3-1000iter.yaml b/configs/archive/deep-cfr-opponent-network-512x3-1000iter.yaml similarity index 100% rename from configs/deep_cfr/deep-cfr-opponent-network-512x3-1000iter.yaml rename to configs/archive/deep-cfr-opponent-network-512x3-1000iter.yaml diff --git a/configs/deep_cfr/deep-cfr-pure-selfplay-full-depth-slot-playability-512x3-2x-updates-10000iter.yaml b/configs/archive/deep-cfr-pure-selfplay-full-depth-slot-playability-512x3-2x-updates-10000iter.yaml similarity index 100% rename from configs/deep_cfr/deep-cfr-pure-selfplay-full-depth-slot-playability-512x3-2x-updates-10000iter.yaml rename to configs/archive/deep-cfr-pure-selfplay-full-depth-slot-playability-512x3-2x-updates-10000iter.yaml diff --git a/configs/deep_cfr/deep-cfr-selfplay-anchor-safe-512x3-2x-updates-10000iter.yaml b/configs/archive/deep-cfr-selfplay-anchor-safe-512x3-2x-updates-10000iter.yaml similarity index 100% rename from configs/deep_cfr/deep-cfr-selfplay-anchor-safe-512x3-2x-updates-10000iter.yaml rename to configs/archive/deep-cfr-selfplay-anchor-safe-512x3-2x-updates-10000iter.yaml diff --git a/configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability-512x3-2x-updates-10000iter.yaml b/configs/archive/deep-cfr-selfplay-full-depth-slot-playability-512x3-2x-updates-10000iter.yaml similarity index 100% rename from configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability-512x3-2x-updates-10000iter.yaml rename to configs/archive/deep-cfr-selfplay-full-depth-slot-playability-512x3-2x-updates-10000iter.yaml diff --git a/configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability-512x3-lcfr-10000iter.yaml b/configs/archive/deep-cfr-selfplay-full-depth-slot-playability-512x3-lcfr-10000iter.yaml similarity index 100% rename from configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability-512x3-lcfr-10000iter.yaml rename to configs/archive/deep-cfr-selfplay-full-depth-slot-playability-512x3-lcfr-10000iter.yaml diff --git a/configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability-512x3-unbounded.yaml b/configs/archive/deep-cfr-selfplay-full-depth-slot-playability-512x3-unbounded.yaml similarity index 100% rename from configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability-512x3-unbounded.yaml rename to configs/archive/deep-cfr-selfplay-full-depth-slot-playability-512x3-unbounded.yaml diff --git a/configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability-unbounded.yaml b/configs/archive/deep-cfr-selfplay-full-depth-slot-playability-unbounded.yaml similarity index 100% rename from configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability-unbounded.yaml rename to configs/archive/deep-cfr-selfplay-full-depth-slot-playability-unbounded.yaml diff --git a/configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability.yaml b/configs/archive/deep-cfr-selfplay-full-depth-slot-playability.yaml similarity index 100% rename from configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability.yaml rename to configs/archive/deep-cfr-selfplay-full-depth-slot-playability.yaml diff --git a/configs/deep_cfr/deep-cfr-opponent-average-strategy-512x3-1000iter.yaml b/configs/deep_cfr/default.yaml similarity index 96% rename from configs/deep_cfr/deep-cfr-opponent-average-strategy-512x3-1000iter.yaml rename to configs/deep_cfr/default.yaml index 984df3f..0a9ea83 100644 --- a/configs/deep_cfr/deep-cfr-opponent-average-strategy-512x3-1000iter.yaml +++ b/configs/deep_cfr/default.yaml @@ -1,5 +1,5 @@ run: - experiment_name: lost-cities-deep-cfr-opponent-average-strategy-512x3-1000iter + experiment_name: deep-cfr-default seed: 79 max_iterations: 1000 max_minutes: null diff --git a/tests/games/classic/test_deep_cfr_trainer.py b/tests/games/classic/test_deep_cfr_trainer.py index e92b4c9..5237ee2 100644 --- a/tests/games/classic/test_deep_cfr_trainer.py +++ b/tests/games/classic/test_deep_cfr_trainer.py @@ -44,7 +44,7 @@ def test_deep_cfr_loads_smoke_yaml_config() -> None: def test_deep_cfr_loads_mapped_legacy_reproduction_config() -> None: - config = load_config("configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability.yaml") + config = load_config("configs/archive/deep-cfr-selfplay-full-depth-slot-playability.yaml") assert config.run.experiment_name.endswith("slot-playability") assert config.run.seed == 79 @@ -92,7 +92,7 @@ def test_deep_cfr_train_cli_accepts_run_and_traversal_config_overrides() -> None ], }, )() - config = load_config("configs/deep_cfr/deep-cfr-selfplay-full-depth-slot-playability.yaml") + config = load_config("configs/archive/deep-cfr-selfplay-full-depth-slot-playability.yaml") overridden = _with_overrides(config, _train_overrides_from_args(args))