# Deep CFR v0 Status vs Legacy coolrl This document tracks the Lost Cities Deep CFR functionality in this repository against the legacy implementation in `../coolrl`. ## Implemented In This Repository ### Traversal Implemented: 1. Recursive `traverse(state, traverser, iteration, depth)` logic. 2. Terminal value handling. 3. Traverser vs opponent node behavior. 4. Advantage-network-driven policies during traversal. 5. Regret matching over legal actions. 6. Sampled action recursion with node-value calculation. 7. Instantaneous regret collection at traverser nodes. 8. Strategy-memory collection. 9. Depth and node-budget cutoffs. 10. Outcome-sampling epsilon. 11. Sampled action probability correction. 12. Optional sampled value clipping. 13. Unsampled regret modes: - `negative_node_value` - `zero` 14. Score-diff and rollout-based cutoff values. 15. Random and safe-heuristic cutoff rollout policies. 16. Deck-draw chance sampling with state restoration. Important implementation note: - The active training path now calls `deep_cfr/traversal.pyx`. - The old Python recursive `deep_cfr/traverser.py` path has been removed from mainline code. - The rules engine (`game.pyx`), encoding (`encoding.pyx`), regret-matching math (`cfr_math.pyx`), and Deep CFR tree-walking loop now have Cython implementations. ### Training And Memory Implemented: 1. PyTorch advantage networks. 2. PyTorch strategy network. 3. Legal-mask-aware advantage loss. 4. Masked strategy cross-entropy loss. 5. Reservoir memory with capacity limits. 6. Batch sampling. 7. Legal masks stored with samples. 8. Single-process traversal. 9. Multiprocessing traversal worker batches. 10. Worker result merge in the parent trainer process. ### Encoding Implemented information-state features: 1. Phase flags. 2. Current player. 3. Encoded player. 4. Deck ratio. 5. Player hand slot features. 6. Public expedition summaries for both players. 7. Public discard summaries. 8. Public card counts. 9. Total score and score diff features. 10. Turn ratio. 11. Pending-discard one-hot. 12. Legal action mask. The encoding is still compact compared with the legacy feature set, but it now contains the key public board, discard, score, and legal-action information. ### Runtime Operations Implemented: 1. Checkpoint save/load. 2. Latest and per-iteration checkpoint files. 3. Config stored in checkpoints and `config.json`. 4. Strategy-net policy adapter. 5. Evaluation against registered classic bots. 6. Training CLI. 7. Evaluation CLI. 8. Traversal benchmark CLI. 9. Local run files: - `config.json` - `metrics.jsonl` - `runtime_progress.json` - `train.log` 10. Traversal benchmark metrics. 11. Self-play league snapshots. 12. Self-play league opponent selection from stored snapshots. 13. Safe-heuristic anchor opponent path. 14. Weighted current/recent/older/anchor self-play league buckets. 15. Safe-heuristic imitation pretraining. 16. Policy-gradient fine-tuning. 17. Single-vs-multiprocessing benchmark comparison. ## Remaining Differences From Legacy coolrl The main Deep CFR v0 gaps listed earlier are now implemented. Remaining differences are mostly experiment-system maturity and legacy-specific research extras. Still smaller than legacy: 1. Config is YAML-first and nested through Pydantic, but only one smoke preset exists under `configs/deep_cfr/`. 2. Multiprocessing exists, but it is intentionally simple: - no progress callback per worker batch - no hotspot timing profile 3. Metrics logging exists, but no plotting/status command exists yet. 4. Checkpoint artifacts are local only; W&B artifact integration is not added. 5. Legacy visualization helpers are not ported. These remaining items are not blockers for running and iterating on Deep CFR v0. ## Performance-Critical Gap This repository was split out to pursue much higher Lost Cities training performance. From that perspective, the main remaining gap is not feature parity with legacy `../coolrl`; it is the traversal backend. Current state: 1. `GameState` mutation, legal-action generation, apply/undo, and cached scoring are implemented in Cython. 2. Information-state encoding and regret matching have Cython modules. 3. Full Deep CFR traversal now runs through `traversal.pyx`. 4. PyTorch policy inference and reservoir memory sample materialization still cross the Python boundary. 5. Traversal is still recursive inside Cython. The Python recursion-limit guard is no longer the main execution path, but an explicit iterative scheduler is still a future optimization. Recommended performance roadmap: 1. Continue moving the traversal hot path away from Python object boundaries: - C-level legal action enumeration - C-level push/pop undo - terminal, depth cutoff, and node-budget cutoff - traverser/opponent node handling - outcome sampling - sampled action value correction - instantaneous regret calculation - strategy sample collection - traversal stats collection 2. Reduce Python boundary costs with batched memory writes. 3. Add batched network inference for policy calls. 4. Replace the recursive Cython DFS with an explicit Cython traversal scheduler. 5. Run multiple traversal contexts concurrently so policy-needed states can be encoded and evaluated in batches. Python iterative traversal is not the preferred performance path. It would remove Python recursion-limit risk, but it would keep most Python object and callback overhead in the hot loop. For performance, the next serious step is a Cython batched iterative traversal scheduler. ## Suggested Next Steps 1. Add batched memory writes from the Cython traversal engine. 2. Add benchmark output for recursive Cython traversal vs batched iterative traversal once the scheduler exists. 3. Add batched policy inference. 4. Add an explicit Cython iterative traversal scheduler. 5. Add a status/plot command that reads `metrics.jsonl`. 6. Add worker progress logging and hotspot timing profile. 7. Add W&B checkpoint artifacts after checkpoint quality is stable.