Promote avg-strategy 1000iter to default.yaml; archive other configs

The avg-strategy 1000iter file (with the recent +traversals/+LR/+LCFR
changes) is the canonical "best-known" config. Renamed it to
default.yaml so users start from a single, obvious entry point and
override one field per ablation via --set. Other 12 configs moved to
configs/archive/ — kept for historical reproduction, not for active use.

- configs/deep_cfr/{default.yaml, smoke.yaml} are the only active configs
- experiment_name shortened to "deep-cfr-default" (was a long mouthful)
- AGENTS.md examples and Project Layout section rewritten around
  default.yaml; ablation example shows the override-one-field pattern
- Tests pointed at the archived slot-playability config for the legacy
  reproduction assertions

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-07 17:09:20 +09:00
co-authored by Claude Opus 4.7
parent a1215959a7
commit 618d5f8167
15 changed files with 22 additions and 14 deletions
+19 -11
View File
@@ -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/game.pyx`: Cython Lost Cities engine.
- `src/coolrl_lost_cities/games/classic/deep_cfr/`: Deep CFR training, - `src/coolrl_lost_cities/games/classic/deep_cfr/`: Deep CFR training,
traversal, evaluation, analysis, and CLI code. 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 - `runs/`: generated training runs. Gitignored, may be a symlink to larger
storage. Layout: storage. Layout:
- `runs/archive/`: past runs. **Do not modify or delete.** - `runs/archive/`: past runs. **Do not modify or delete.**
@@ -67,28 +73,28 @@ Real experiment (lands in `runs/`):
```bash ```bash
uv run lost-cities-deep-cfr train \ 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 --keep
# → runs/<YYYY-MM-DD_HHMMSS>_lost-cities-deep-cfr-selfplay-full-depth-slot-playability/ # → runs/<YYYY-MM-DD_HHMMSS>_deep-cfr-default/
``` ```
Variant of the same config (override slug): Variant / ablation (override one field; keep slug informative):
```bash ```bash
uv run lost-cities-deep-cfr train \ 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 \ --keep \
--set run.experiment_name=color-attn-v2 --set training_weighting.mode=none \
# → runs/<YYYY-MM-DD_HHMMSS>_color-attn-v2/ --set run.experiment_name=ablation-no-lcfr
# → runs/<YYYY-MM-DD_HHMMSS>_ablation-no-lcfr/
``` ```
Short fixed-iteration run: Short fixed-iteration run:
```bash ```bash
uv run lost-cities-deep-cfr train \ 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_iterations=100 \
--set run.max_minutes=null \
--set checkpoint.save_every=0 --set checkpoint.save_every=0
``` ```
@@ -96,7 +102,7 @@ Resume (path required, no shortcut):
```bash ```bash
uv run lost-cities-deep-cfr train \ 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/<YYYY-MM-DD_HHMMSS>_<slug>/latest.pt --resume runs/<YYYY-MM-DD_HHMMSS>_<slug>/latest.pt
``` ```
@@ -142,7 +148,9 @@ Start a long unbounded run:
tmux new-session -s coolrl-deepcfr-unbounded \ tmux new-session -s coolrl-deepcfr-unbounded \
-c /home/coolguy/dev/coolrl-lost-cities \ -c /home/coolguy/dev/coolrl-lost-cities \
'uv run lost-cities-deep-cfr train \ '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' --keep'
``` ```
@@ -1,5 +1,5 @@
run: run:
experiment_name: lost-cities-deep-cfr-opponent-average-strategy-512x3-1000iter experiment_name: deep-cfr-default
seed: 79 seed: 79
max_iterations: 1000 max_iterations: 1000
max_minutes: null max_minutes: null
+2 -2
View File
@@ -44,7 +44,7 @@ def test_deep_cfr_loads_smoke_yaml_config() -> None:
def test_deep_cfr_loads_mapped_legacy_reproduction_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.experiment_name.endswith("slot-playability")
assert config.run.seed == 79 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)) overridden = _with_overrides(config, _train_overrides_from_args(args))