CFR+ is pretty similar to Vanilla, so far I have always used Monte Carlo methods.
So basically the value of a Turn all in should be similar to a River Showdown Node, but instead of just summing wins/losses I think you have to multiply the probability of each opponent hand with your equity against it.
Code:
std::vector<double> ev(1326, 0);
const Distribution &pholes = distributions[trainPlayer];
const Distribution &oholes = distributions[!trainPlayer];
for (int i = 0; i < p.size(); i++){
double sum = 0;
for (int j = 0; j < op.size(); j++){
if (!pholes[i].overlaps(oholes[j])){
sum += op[j] * (2 * turnEquities[i][j] - 1);
}
}
ev[i] = sum * payoff;
}
return ev;
So far my games are always starting from the Turn. I created an equity table, but it takes a long time to create for each turn and it's rather big.
How do programs like Pio Solver do it? I don't think they are creatign tables, but I think they are using Vanilla or CFR+
Any ideas? You see any bugs in my code? It's loosely based on Amax' code.
One idea would of course be to just enumerate all Rivers, but I guess that would be slow?