Hi — I've been reading through this repo and testing some cases. Two things came up that I wanted to ask you about.
- Opening frequencies
I ran every one of the 169 starting hands through the policy in an unopened pot — everyone folds to hero, 100bb, blinds 50/100. Preflop the features only depend on the hand class, so this is the exact range rather than a sample. Script to reproduce attached.
seat raise call fold
LJ 6.8% 14.6% 78.6%
HJ 15.8% 4.9% 79.3%
CO 33.4% 0.9% 65.8%
BTN 74.2% 3.9% 21.9%
SB 95.7% 4.3% 0.0%
The small blind never folds — it raises 95.7% of hands and completes the rest. The button plays 78%. LJ limps 14.6%, more than twice as often as it raises. Those percentages seem off compared to standard GTO opening ranges. Is that expected? Or is that what converges given the limited bet sizes
(half-pot and pot) available on the later streets?
- Which network is shipped?
data/deep_cfr_model.npz has trunk_w0 and adv_* but no strategy_w0, so DeepCFRLookup takes the regret-matching branch. Same in all 13 archive tags. But training/train.py has AverageStrategyNet and _export_strategy_npz, and the runtime already handles strategy_w0 as "average_strategy". So I'd have expected the shipped model to be the average-strategy net. Am I misunderstanding something?
Thanks for putting all this up — the experiment ledger is a genuinely good read.
Hi — I've been reading through this repo and testing some cases. Two things came up that I wanted to ask you about.
I ran every one of the 169 starting hands through the policy in an unopened pot — everyone folds to hero, 100bb, blinds 50/100. Preflop the features only depend on the hand class, so this is the exact range rather than a sample. Script to reproduce attached.
seat raise call fold
LJ 6.8% 14.6% 78.6%
HJ 15.8% 4.9% 79.3%
CO 33.4% 0.9% 65.8%
BTN 74.2% 3.9% 21.9%
SB 95.7% 4.3% 0.0%
The small blind never folds — it raises 95.7% of hands and completes the rest. The button plays 78%. LJ limps 14.6%, more than twice as often as it raises. Those percentages seem off compared to standard GTO opening ranges. Is that expected? Or is that what converges given the limited bet sizes
(half-pot and pot) available on the later streets?
data/deep_cfr_model.npz has trunk_w0 and adv_* but no strategy_w0, so DeepCFRLookup takes the regret-matching branch. Same in all 13 archive tags. But training/train.py has AverageStrategyNet and _export_strategy_npz, and the runtime already handles strategy_w0 as "average_strategy". So I'd have expected the shipped model to be the average-strategy net. Am I misunderstanding something?
Thanks for putting all this up — the experiment ledger is a genuinely good read.