Repository navigation
Conversation
…not -2) possible_deals divided each chance child's reach by (deck - board - 2), but a dealt card must avoid both players' hole cards, so only (deck - board - 4) children are reachable for any hand pair. The probabilities therefore summed to less than 1 (44/46 on the turn, 45/47 on the flop), scaling every post-chance value down while fold values at the same parent stayed exact. Fixes bupticybee#95. The Monte-Carlo sampling range keeps its previous upper bound (possible_deals + 1 + 4 == old possible_deals + 1 + 2).
Open
Owner
|
You sure about this? I remember I did a lot of math work on this hard for me to believe I could made some mistake here. And exploitability are converging as well. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #95.
Problem
chanceUtility(PCfrSolver.cpp) andchanceBestReponse(BestResponse.cpp) divide each chance child's reach bypossible_deals = cards - board - 2;For any concrete pair of hands, the dealt card must avoid both players' hole cards, so only
cards - board - 4children are reachable. The reachable children's probabilities therefore sum to(cards-board-4)/(cards-board-2)instead of 1: 44/46 on the turn → river deal, 45/47 on the flop → turn deal. Every value below a chance node is scaled down by that factor, while a fold child under the same parent keeps its exact value — so the solver optimizes a slightly different game, as @yffbit described in #95.Experiment (as requested in #95)
A check-check turn game, so the exact game value can be enumerated without any solver.
As Kd 7h 2c, pot 100, OOPQQ,AJs,KQo, IPJJ,AQs,KJo,98s, no bet sizes (check-check only). Command file attached below.enumerate.py(attached): averages, over every compatible hand pair, the showdown result over the 44 remaining river cards.masterlogicWe first noticed this while cross-checking TexasSolver against another CFR engine on a turn game with bets. Before the fix, the two engines' root EVs differed by ~0.49% of the pot and the best-response brackets did not overlap. After the fix, they agree within 0.0002% of the pot. On flop games (two chance layers) the gap is larger.
Change
- 2→- 4in the twopossible_dealslines.MonteCarolAlg::PUBLICsampling range is kept identical (possible_deals + 1 + 4equals the oldpossible_deals + 1 + 2).experimental/TCfrSolver.cpphas the same line but is not built, so it is left untouched.consolebranch (BestResponse.cpp:118, PCfrSolver.cpp:229); the same 2-line change applies there.cmd.txt
The OOP value is
-(player 0 exploitability)from the solver log (the game has no decisions).enumerate.py