Skip to forum
HU Postflop GTO sof...
 
Notifications
Clear all

HU Postflop GTO software (JBMCCFR)

41 Posts
5 Users
0 Reactions
21.9 K Views
jbpatzer
Joined: 23.11.2009

Added the results for BTN calling a SB 3bet, as suggested by Jules. This is with my old bucketting algorithm.

That'll be the last new file for a while until I've got an epsilon distance routine working. This will actually also allow me to decide when to stop iterating by using a threshold on exploitability, rather than just going 'Oooo. That looks like it's not changing much anymore. I expect it's converged,' which, in hindsight, is an approach not without flaws. :pokerface:


Reply
Quote
jbpatzer
Joined: 23.11.2009

Just added a new file 'Qs8s2c_GTORB_60percent_gui', that analyses the situation discussed in the excellent video below. He uses some fraction of AQo in Hero's range, but I haven't coded that up yet, so I gave him all combos of AQ. If you compare what I get to what he gets (ofc my turn ranges are different, because I solve from the flop, not the turn) the conclusions are very similar.

The file is big, and the gui uses 1.5Gb of RAM, so be patient if it's a bit slow to load. These are wide ranges and deep stacks, so it took several days to calculate and is the solution is exploitable by less than 2.5% of the pot. :sfishy:


Reply
Quote
DaPhunk
Joined: 01.03.2008

Wow, this work you have put in looks very impressive to me. Downloading your program as I type now, feel like you are for sure owed a beer for sharing this with us! (sorry if you don't drink, and yes, I'm saying this before I've even seen the program for myself :f_love:)


Reply
Quote
jbpatzer
Joined: 23.11.2009

:f_drink:

But let's see whether you can get it working on your machine first....


Reply
Quote
jbpatzer
Joined: 23.11.2009

I've uploaded a new version to tinyurl.com/JBMCCFR which gives a smaller interface and can cope with the new files I've added, which include rake. Details of the many new solution files I've added are in the readme file.


Reply
Quote
jbpatzer
Joined: 23.11.2009

I'm testing CFR+ on my computer at work on a full sized problem, where it seems to slightly, but significantly outperform my CFR algorithm. However, I got bored with waiting for it to finish, so I tried testing it tonight on my laptop with a small problem (QQ+, AKo, v QQ+ AKo). Here's what I got. In each case the top graph is the Player 1's strategy for each flop hand bucket at the first decision node as a function of number of CFR sweeps (a CFR sweep is a complete sweep through all possible flop hand bucket match ups, turn card buckets and river card buckets). Note that it's really hard to say whether it's converged, and it's all I had to go on before I started calculating the exploitability. The lower graph is the exploitability in millipots. The horizontal, dashed line is 20 millipots, where I stop.

CFR+ with averaging

CFR+ with weighted averaging

Standard CFR (with external sampling)

As you can see, standard CFR outperforms CFR+ by a wide margin. I can only, provisionally, conclude that CFR+ is only more efficient than CFR if the ranges are sufficiently large. I'll be interested to see whether this corresponds to any theoretical predictions that those nice game theorists come up with.


Reply
Quote

Thanks Jb for the new small interface that works great on my laptop. I even managed to understand how to use it...

Would it be possible for you to give each player's EV, not only for the top of the tree but on each branch, to check in particular which turn or river cards are more profitable for each player?

When a player checks 100% of his range and you chose a "raise" option, are the results for the other player meaningfull or as for a Nash equilibrium it does not matter what you do on 0% probability situations ?


Reply
Quote
jbpatzer
Joined: 23.11.2009

Originally posted by CarrollJeff

Would it be possible for you to give each player's EV, not only for the top of the tree but on each branch, to check in particular which turn or river cards are more profitable for each player?

I'm sure it would. I just need to motivate myself to do it.

When a player checks 100% of his range and you chose a "raise" option, are the results for the other player meaningfull or as for a Nash equilibrium it does not matter what you do on 0% probability situations ?

I've checked that the solutions have low exploitability, so even if a player goes off piste, such as betting when the equilibrium solution is 100% checking, the strategy of the other player shouldn't be losing money. During the CFR minimization, I have a small threshold that decays every iteration, so that even if a player's strategy is never to bet, he will bet a small fraction of the time so that the opponent develops a strategy down those unused branches of the game tree. Mind you, now that you mention it, I suppose it could be some of those branches that provide the exploitability that I can't squeeze out of the solution. I think it's mainly information loss when I do the bucketting, but it could be some poorly trained branches too. I'll have to think about that one.


Reply
Quote
jbpatzer
Joined: 23.11.2009

Added a solution with a Q♠:J♠:T♠: flop.


Reply
Quote

Thank you for sharing these hand analysis.

About your CFR+ problem, I recently read this paper: Solving Large Imperfect Information Games Using CFR+, and on fig.1 he shows that for small information sets (or small decks as he calls it), CFR+ does not converge well. This may be linked with what you saw there.

I am also interested in next year 3-players competition, I'll think about how I could participate and maybe team up.


Reply
Quote
jbpatzer
Joined: 23.11.2009

Originally posted by CarrollJeff

About your CFR+ problem, I recently read this paper: Solving Large Imperfect Information Games Using CFR+, and on fig.1 he shows that for small information sets (or small decks as he calls it), CFR+ does not converge well. This may be linked with what you saw there.

Maybe. I'm trying some variations of CFR+ at the moment. The problem is that, since it only works well on larger problems, it takes ages.

I am also interested in next year 3-players competition, I'll think about how I could participate and maybe team up.

I'd certainly be interested. I think that good opponent modelling is the key, but I don't know much about it so I'm reading the literature at the moment. I'd only be interested in the Kuhn poker competition, not real poker - too hard. We should talk on Skype.


Reply
Quote

Yes Kuhn poker sounds good to me? Leduc would also be interesting as next step.

We might arrange a Skype chat during the week-end evenings (depending on the children ;)), you may send me your availability and skype-id at jfpeltier on gmail.

I have started a list of ideas I want to investigate related to multiplayer games. This is related to collusion, metagame and may apply to lemonade stand types of games.


Reply
Quote
jbpatzer
Joined: 23.11.2009

Originally posted by CarrollJeff
Yes Kuhn poker sounds good to me? Leduc would also be interesting as next step.

We might arrange a Skype chat during the week-end evenings (depending on the children ;)), you may send me your availability and skype-id at jfpeltier on gmail.

I have started a list of ideas I want to investigate related to multiplayer games. This is related to collusion, metagame and may apply to lemonade stand types of games.

Weekend evenings sounds good. My Skype id is the obvious one (in before they delete your post for posting contact info).

Have you read what I wrote here?

> http://www.modernpokereducation.com/preview/bonus_maths_5.pdf <


Reply
Quote

Originally posted by jbpatzer
Weekend evenings sounds good. My Skype id is the obvious one.

Ok I'll try around 10pm on Saturday. But we could also exchange by mail beforehand, not to spam this forum and share more sensitive insights...

Originally posted by jbpatzer
Have you read what I wrote here?

> http://www.modernpokereducation.com/preview/bonus_maths_5.pdf

Yes very good, I did not remember it was from you though. This set me thinking again that there are better strategies than naive Nash Equilibrium and that this could also being used in my occasional lottery 3-players poker.


Reply
Quote

A long time ago I spent some time programming on my HP25 a very simple game of binary guessing, where a human should try to be unpredictable, and the machine would try to guess his next choice.
Very simple methods gives good results, I have rewrote it in python and I wonder if you can manage to win without analyzing the code (you need to get to 10 to win):

play.py

import random
p=[]
depth=11
for i in range(depth):
p.append(random.randint(0,1))

score=0
last=0
print "Show some freewill"
while True:
guess=input("0 or 1 ? ")
if guess>1: break
print "I guessed ",p[last]
if p[last]==guess:
score=score-1
if score<-9:
print "Lost"
break
else:
score=score+1
if score>9:
print "You Win!"
break
print "Score: ",score
p[last]=guess
last=(2*last+guess)%depth

This is fully exploitable, so then more complex variants used detection of exploitation and switching back to random play until you could exploit the opponent again.


Reply
Quote

Hum python and indentation...:f_o:

import random
p=[]
depth=11
for i in range(depth):
   p.append(random.randint(0,1))

score=0
last=0
print "Show some freewill"
while True:
   guess=input("0 or 1 ? ")
   if guess>1: break
   print "I guessed ",p[last]
   if p[last]==guess:
      score=score-1
      if score<-9:
         print "Lost"
         break
   else:
      score=score+1
      if score>9:
         print "You Win!"
         break
   print "Score: ",score
   p[last]=guess
   last=(2*last+guess)%depth

Reply
Quote
jbpatzer
Joined: 23.11.2009

I've never used python.....:sorry:

Did you get my email.


Reply
Quote

So here it is in C:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "common.h"
#include "time.h"

#define DEPTH 11
char p[DEPTH],i;
int main() {

srand(time(NULL));
for (i=0;i<DEPTH;i++) {
   p[i]=rand()%2;
   }

int score=0;
char last=0,guess;
printf ("Show some freewill\n");
while (1) {
   if (guess>=0) printf("0 or 1 ? ");
   scanf("%c",&guess);
   fflush(stdin);
   fflush(stdin);
   guess -=0x30;
   if (guess>1)  break;
   if (guess<0)  continue;
   printf("Your choice %d\n",guess);
   printf ("I guessed %d\n",p[last]);
   if (p[last]==guess) {
      score--;
      if (score<-9) {
         printf ("Lost \n");
         break;
      }
   }
   else {
      score++;
      if (score>9) {
         printf ("You Win! \n");
         break;
         }
   }
   printf ("Score: %d \n",score);
   p[last]=guess;
   last=(2*last+guess)%DEPTH;
   }
}

Reply
Quote
jbpatzer
Joined: 23.11.2009

It pwns me. I am clearly a robot. :fouet:


Reply
Quote
SHAKA1992
Joined: 10.07.2010

what is your opinion about pokersnowie?


Reply
Quote