Inspiration
What it does
How we built it
Challenges we ran into
Accomplishments that we're proud of
What we learned
What's next for sdbot: range-reading Short Deck PLO5 bot
What it does
sdbot plays Heads-Up Short Deck 5-card Pot-Limit Omaha for the TAMU Datathon Poker Bot challenge. It models the opponent's range from their actions, computes Monte Carlo equities against that range, and searches two plies of the current street to pick the action with the highest expected value, within the 8-second time bank per 1,000-hand half.
How we built it
- Range model. The opponent's range is an exponential tilt over sampled hands, driven by a strength score fitted (MAP with priors) on this half's showdowns and their action counts. Facing a postflop bet or raise, the range is cut to the share of hands that take that action, using the response model's own prediction; bet size is read too (a pot-sized bet as the strongest share).
- Equity. Monte Carlo against the range for the current state and for the ranges after each of their replies; exact board on the river.
- Decision. Two-ply search of the street: fold, check/call (with their bet probability and our best reply, including check-raise valuation), and each raise size with their fold/call/re-raise probabilities from learned logistic response models.
- Robustness. Any exception, or a nearly empty time bank, falls back to a simple rule bot; the server's CPU time is metered for pacing. Tests cover fallbacks and odd inputs.
How we measured
Every option was tested as paired differences in bb/deal over 1,000-deal duplicate matches and 6 to 24 seeds, head to head against the current default and against a pool of 5 to 8 exploiter bots (lag, tag, maniac, bully, trap, calling station and others). A change was kept only when neither self-play nor the pool dropped. Kept changes include reading bet size (+0.56 ± 0.16 bb/deal self, +0.08 pool) and cutting the range by frequency when facing a postflop bet (+0.39 ± 0.09 self, +0.17 ± 0.06 pool). The attached ZIP includes docs/strategy.md with the full table, including the options left off.
Built with Python, NumPy, FastAPI and uvicorn; the preflop tables were precomputed offline.
