Inspiration
Heads-up Short Deck 5-card Pot-Limit Omaha is a game nobody has published a solver or bot for, so we couldn't download an answer. We wanted to take the guesswork out: measure everything, and only ship changes that win statistically.
What it does
Our bot ("sooz-hunter") plays every decision by expected value:
- It estimates its win chance with Monte Carlo simulation (a vectorized numpy hand evaluator, ~25x faster than the reference one) plus a precomputed preflop equity table for all 19,998 suit-isomorphic starting hands.
- It learns each opponent live: fold rates to our bets per street, how often they bet after we check, how often they raise our bets, and how strong the hands they show down actually are (used to calibrate their betting range). The model is recency-weighted so it adapts to opponents that change style.
- A stop-loss hedge: an MCCFR blueprint strategy (trained over the exact betting tree, ~39 billion iterations) takes over only if the bot is clearly losing to an opponent.
- A time governor keeps it inside the 8 s time bank on slow machines, with a zero-cost fallback.
How we built it
- Exported the exact betting tree from the rules (41,490 nodes) and trained an external-sampling MCCFR solver in C++ on a 3M-deal pool with per-street hand-strength buckets.
- Built an in-process duplicate-match simulator that scores exactly like the judge (95% CI on paired bb/deal), and a field of opponent bots.
- Ran a "red team": an evolutionary search (CMA-ES over a 47-parameter bot family) that tried to find strategies beating our bot. Each exploit it found (a bet-size tell, pooled fold rates, ignoring re-raises, a phase-switching trap...) was fixed and every fix had to pass a paired A/B gate on fresh seeds before shipping.
Challenges
Staying inside the time bank under CPU contention, and an adaptive bot being exploitable by opponents that change style mid-match.
What we learned
Optimize the real objective: matches are won by the t-statistic of the edge, not raw chips, and robustness beats brilliance.