Poker-AI.org
http://poker-ai.org/phpbb/

Bug in Spears 2+2 Evaluator, or am I not using it correctly?
http://poker-ai.org/phpbb/viewtopic.php?f=24&t=2448
Page 1 of 1

Author:  HontoNiBaka [ Wed Apr 10, 2013 2:59 am ]
Post subject:  Bug in Spears 2+2 Evaluator, or am I not using it correctly?

Code:
  public static double riverEquity(HoleCards hero, Range range, Board board) {
      double win = 0;
      double runs = 0;
      // VillainRange
      Range villainRange = range.cardRemoval(board.getBoardCards());
      villainRange = villainRange.cardRemoval(hero.getCard1());
      villainRange = villainRange.cardRemoval(hero.getCard2());
      // All boardcards
      LinkedList<Card> boardCards = board.getBoardCards();
      // u Values for the board in the lookup table
      int u0 = Generator.handRanks[53 + boardCards.get(0).getEval()];
      int u1 = Generator.handRanks[u0 + boardCards.get(1).getEval()];
      int u2 = Generator.handRanks[u1 + boardCards.get(2).getEval()];
      int u3 = Generator.handRanks[u2 + boardCards.get(3).getEval()];
      int u4 = Generator.handRanks[u3 + boardCards.get(4).getEval()];
      // heroValue
      int h1 = Generator.handRanks[u4 + hero.getCard1().getEval()];
      int h2 = Generator.handRanks[h1 + hero.getCard2().getEval()];

      for (HoleCards villainCards : villainRange) {
         // Villain Value
         int v1 = Generator.handRanks[u4 + villainCards.getCard1().getEval()];
         int v2 = Generator.handRanks[v1 + villainCards.getCard2().getEval()];
         System.out.print(h2 + "   ");
         System.out.println(v2);
         if (h2 > v2) {
            win++;
            runs++;
         } else if (h2 < v2) {
            runs++;
         } else {
            win = win + 0.5;
            runs++;
         }
      }
      return win / runs;
   }


getEval() returns the int Value for a card. I have doublechecked my implementation of getEval(), the int values were correct. The evaluator computes strange ranks, it also doesnt seem to recognize nut boards.

Author:  Coffee4tw [ Wed Apr 10, 2013 7:15 am ]
Post subject:  Re: Bug in Spears 2+2 Evaluator, or am I not using it correc

What are handranks[] and getEval() supposed to do exactly?
I don't really understand what you are trying to do, seems to be a somewhat strange way to get the equity of one hand against all the remaining hands.

The way you should be using this is like this:
1) Input a 7 card hand into the evaluator (hero's holecards + board), get the rank.
2) Input another 7 card evaluator (villain's holecards + board), get the rank.
3) Compare both ranks to see which is higher, aka wins.

Author:  spears [ Wed Apr 10, 2013 11:51 am ]
Post subject:  Re: Bug in Spears 2+2 Evaluator, or am I not using it correc

- At a glance I don't see that you are doing much wrong.
- I don't have a lot of time to help you right now.
- I notice that you refer to Spears 2 + 2 Evaluator and Generator
- pokerai.game.eval.spears2p2 contains the class StateTableEvaluator
- pokerai.game.eval.twoplustwo contains the class Generator
- Generator and StateTableEvaluator use a different convention for card ids
- Maybe you are using the wrong card id?
- It would help if you could break the problem down further. eg generate the rank of a particular hand.

Author:  birchy [ Wed Apr 10, 2013 10:44 pm ]
Post subject:  Re: Bug in Spears 2+2 Evaluator, or am I not using it correc

Don't forget that the returned integer is a 2-part binary which contains hand category and hand rank. You have to do a couple of bitwise operations to separate them:

http://www.codingthewheel.com/archives/ ... undup/#2p2

Author:  HontoNiBaka [ Thu Apr 11, 2013 3:08 am ]
Post subject:  Re: Bug in Spears 2+2 Evaluator, or am I not using it correc

Coffee4tw wrote:
What are handranks[] and getEval() supposed to do exactly?
I don't really understand what you are trying to do, seems to be a somewhat strange way to get the equity of one hand against all the remaining hands.

The way you should be using this is like this:
1) Input a 7 card hand into the evaluator (hero's holecards + board), get the rank.
2) Input another 7 card evaluator (villain's holecards + board), get the rank.
3) Compare both ranks to see which is higher, aka wins.


getEval() returns the int conversion of my Card Object. I am representing cards as objects with a suit and a rank in my program, I dont use ints directly, so I need that method.

handRanks[] ist the LUT. I am inserting the 5 boardcards first, so I only need 2 lookups for every hand villain can hold.

I use this conversion:

2c = 1 2d = 14 2h = 27 2s = 40
3c = 2 3d = 15 3h = 28 3s = 41
4c = 3 4d = 16 4h = 29 4s = 42
5c = 4 5d = 17 5h = 30 5s = 43
6c = 5 6d = 18 6h = 31 6s = 44
7c = 6 7d = 19 7h = 32 7s = 45
8c = 7 8d = 20 8h = 33 8s = 46
9c = 8 9d = 21 9h = 34 9s = 47
Tc = 9 Td = 22 Th = 35 Ts = 48
Jc = 10 Jd = 23 Jh = 36 Js = 49
Qc = 11 Qd = 24 Qh = 37 Qs = 50
Kc = 12 Kd = 25 Kh = 38 Ks = 51
Ac = 13 Ad = 26 Ah = 39 As = 52

I also tried to split the handrank into 2 parts as described on CTW, but it still didnt work:

Code:
   public static double riverEquity(HoleCards hero, Range range, Board board) {
      double win = 0;
      double runs = 0;
      // VillainRange
      Range villainRange = range.cardRemoval(board.getBoardCards());
      villainRange = villainRange.cardRemoval(hero.getCard1());
      villainRange = villainRange.cardRemoval(hero.getCard2());
      // All boardcards
      LinkedList<Card> boardCards = board.getBoardCards();
      // u Values for the board in the lookup table
      int u0 = Generator.handRanks[53 + boardCards.get(0).getEval()];
      int u1 = Generator.handRanks[u0 + boardCards.get(1).getEval()];
      int u2 = Generator.handRanks[u1 + boardCards.get(2).getEval()];
      int u3 = Generator.handRanks[u2 + boardCards.get(3).getEval()];
      int u4 = Generator.handRanks[u3 + boardCards.get(4).getEval()];
      // heroValue
      int h1 = Generator.handRanks[u4 + hero.getCard1().getEval()];
      int h2 = Generator.handRanks[h1 + hero.getCard2().getEval()];
      

      for (HoleCards villainCards : villainRange) {
         // Villain Value
         int v1 = Generator.handRanks[u4 + villainCards.getCard1().getEval()];
         int v2 = Generator.handRanks[v1 + villainCards.getCard2().getEval()];
         //System.out.print(h2 + "   ");
         //System.out.println(v2);
         
         int handcategoryHero = h2>>12;
         int handcategoryVillain = v2>>12;
         int rankHero = h2&0x00000FFF;
         int rankVillain = v2 &0x00000FFF;
         //System.out.println(handcategoryHero);
         //System.out.println(handcategoryVillain);
         if (handcategoryHero > handcategoryVillain) {
            System.out.println(hero);
            System.out.println(villainCards);
            win++;
            runs++;
         } else if (handcategoryHero<handcategoryVillain) {
            runs++;
         } else {
            if(rankHero > rankVillain){
               win++;
               runs++;
            }
            else if(rankHero < rankVillain){
               runs++;
            }
            else{
               win = win + 0.5;
               runs++;
            }
         }
      }
      return win / runs;
   }


On a Ad Ac Th 4c 2c board I get 8393 for a AhAs hand and 8248 for a 5d5h hand.

Author:  birchy [ Thu Apr 11, 2013 7:59 pm ]
Post subject:  Re: Bug in Spears 2+2 Evaluator, or am I not using it correc

Your string to integer conversions are wrong. In Python, the lookup dict is this:
Code:
{
    'str_to_int':
        {
            '2c': 1, '2d': 2, '2h': 3, '2s': 4,
            '3c': 5, '3d': 6, '3h': 7, '3s': 8,
            '4c': 9, '4d': 10, '4h': 11, '4s': 12,
            '5c': 13, '5d': 14, '5h': 15, '5s': 16,
            '6c': 17, '6d': 18, '6h': 19, '6s': 20,
            '7c': 21, '7d': 22, '7h': 23, '7s': 24,
            '8c': 25, '8d': 26, '8h': 27, '8s': 28,
            '9c': 29, '9d': 30, '9h': 31, '9s': 32,
            'Tc': 33, 'Td': 34, 'Th': 35, 'Ts': 36,
            'Jc': 37, 'Jd': 38, 'Jh': 39, 'Js': 40,
            'Qc': 41, 'Qd': 42, 'Qh': 43, 'Qs': 44,
            'Kc': 45, 'Kd': 46, 'Kh': 47, 'Ks': 48,
            'Ac': 49, 'Ad': 50, 'Ah': 51, 'As': 52
        },
    'int_to_str':
        {
            1: '2c', 2: '2d', 3: '2h', 4: '2s',
            5: '3c', 6: '3d', 7: '3h', 8: '3s',
            9: '4c', 10: '4d', 11: '4h', 12: '4s',
            13: '5c', 14: '5d', 15: '5h', 16: '5s',
            17: '6c', 18: '6d', 19: '6h', 20: '6s',
            21: '7c', 22: '7d', 23: '7h', 24: '7s',
            25: '8c', 26: '8d', 27: '8h', 28: '8s',
            29: '9c', 30: '9d', 31: '9h', 32: '9s',
            33: 'Tc', 34: 'Td', 35: 'Th', 36: 'Ts',
            37: 'Jc', 38: 'Jd', 39: 'Jh', 40: 'Js',
            41: 'Qc', 42: 'Qd', 43: 'Qh', 44: 'Qs',
            45: 'Kc', 46: 'Kd', 47: 'Kh', 48: 'Ks',
            49: 'Ac', 50: 'Ad', 51: 'Ah', 52: 'As'
        }
}


FYI:
'AhAs' = [51, 52]
'AdAcTh4c2c' = [50, 49, 35, 9, 1]
hand_rank = 32921 = [8, 153]

Author:  proud2bBot [ Fri Apr 12, 2013 12:00 am ]
Post subject:  Re: Bug in Spears 2+2 Evaluator, or am I not using it correc

Given the discussion here, I was taking a look into changing my HandEvaluator (Steve Brecher's) with the Spears 2+2 one. Performing a speed test showed however weird results when comparing them to the evaluation thread. Here's how I compared the two approaches:


1. Generate 100k random 7 card hands
2. Generate a list with int[] of all boards using the 2+2 coding
3. Generate a list with long of all boards using the Brecher coding
4. Initialize the 2+2 Evaluator.

Now for each Evaluator, I run a loop 1000 times where it iterates over all coded hands (lists generated in step 2/3) and take the time. So in total, 1000 * 100000 = 100M hands are evaluated.

Here are the times in milliseconds:
2+2: 14773
Brecher: 2228

I'm not sure why 2+2 is so much slower than expected and also why Brecher's code is very fast compared to the Evaluation results (though it might be due to different test hardware). Anyone notices a flaw in the comparison of the 2 approaches?

Author:  spears [ Fri Apr 12, 2013 6:03 am ]
Post subject:  Re: Bug in Spears 2+2 Evaluator, or am I not using it correc

@birchy Thanks for sorting that out

@p2bb There are two variants of the 2+2 evaluator in the distribution:
- pokerai/game/eval/twoplustwo is ugly and fast (1) in http://www.poker-ai.org/archive/www.pok ... l?f=3&t=16)
- pokerai/game/eval/spears2p2 is pretty but slow (4) in http://www.poker-ai.org/archive/www.pok ... l?f=3&t=16

pokerai/game/eval/twoplustwo runs quickly when the hands are ordered like this:
6d 3s 8h 9c Ah 3h 2c
6d 3s 8h 9c Ah 3h 3c
6d 3s 8h 9c Ah 3h 4c
6d 3s 8h 9c Ah 3h 5c
...
6d 3s 8h 9c Ah 4h 2c
6d 3s 8h 9c Ah 4h 3c
6d 3s 8h 9c Ah 4h 4c

... but slowly when hands are submitted randomly. If you take a look at HontoNiBaka's code above, the reason should be clear.

Author:  proud2bBot [ Fri Apr 12, 2013 3:30 pm ]
Post subject:  Re: Bug in Spears 2+2 Evaluator, or am I not using it correc

Ahhh, thanks. I took the slow one - but it was pretty indeed ;) Now I'll check out quasimodo...

Author:  JohnGalt82 [ Wed Aug 21, 2013 8:40 am ]
Post subject:  Re: Bug in Spears 2+2 Evaluator, or am I not using it correc

I remember 2p2 7eval had bugs which I was bitten by in the past. I am not 100% sure it was this one (it was one with code pasted in one of the 2p2 threads). There was Python one as well which also was buggy.
I switched to Brecher's eval for everything and I love it.

Page 1 of 1 All times are UTC
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/