I am currently adding PLO to my solver and I have been doing some research on evaluators. The most common approach seems to be to take a 5 card evaluator and iterate over all possible combinations of board and holecards.
There are (4 choose 2) = 6 hole card combinations and (5 choose 3) board card combinations, resulting in 60 combinations to check. Being around 60 times slower than Hold'em doesn't sound like a great solution.
The evaluators that I have found so far that would support this approach are:
1. Poker-Eval
https://github.com/atinm/poker-evalI was not able to compile it on my Windows machine so far.
2. Steve Brecher:
I am able to use it on my machine, I have used it for Hold'em before. But having to test all combinations is still slow.
I have also found code written by Pulser which does not require checking multiple combinations, it looks faster than the other approach.
viewtopic.php?f=26&t=2705download/file.php?id=67I was also thinking about creating a LUT. K. Waugh's isomorphism algorithm (
viewtopic.php?f=25&t=2660) tells me there are 502,018,902 river indexes, if I store the rank as a 4 byte integer that would mean a 2GB LUT. It's doable but not perfect. Unlike Hold'em I think the distinction between the hole cards and board cards is important for omaha, so my indexer code looks like this:
Code:
const uint8_t cards_per_round_river[2] = { 4, 5 };
hand_indexer_init(2, cards_per_round_river, &riverIndexer);
instead of this
Code:
const uint8_t cards_per_round_river[1] = { 9 };
hand_indexer_init(1, cards_per_round_river, &riverIndexer);
I will see if I find better solutions and keep the thread updated. Is anyone else working on PLO and has any tips how to improve the performance?