I am not sure if my NE calculation is really that fast, I mean it's ok I guess but not faster than other commercial solvers.
The NE calculation takes way longer than calculating EV or EQ, that is true, but the usage and the user's expectations are different. Basically the user runs the training over night generally, but then when he views the results he wants a responsive GUI.
So for example if he views the root of the game, the EQ and EV should be computed in maybe a second or so, and when he chooses an action, in other words he changes to a different game state, the EQ and EV should again be computed in about a second.
A full best response from the preflop round would take much longer than that, especially in multiway pots. If you for example take something like Equilab it takes some time to compute Equities for a 5 player situation, so I thought there might be faster ways with LUTs or so.
My monte carlo sampling looks like this:
Code:
std::discrete_distribution<int> distribution;
int HolecardRandomDistribution::nextCombo(unsigned long long cardMask) {
int index = distribution(generator);
unsigned char cards[2];
Range::getHoleCardCombinationFromIndex(cards, index);
while ((((cardMask | (1ULL << cards[0])) == cardMask) || (((cardMask | (1ULL << cards[1]))) == cardMask))) {
index = distribution(generator);
Range::getHoleCardCombinationFromIndex(cards, index);
}
return index;
}
Basically I sample a combination from a vector with 1326 probabilities and after each combo that I sample I set the corresponding bit in the cardMask.
If the combination that I sampled overlaps with any combinations that were sampled before, I resample.
For preflop HU and preflop 3handed I use LUTs.