예제 #1
0
 def test_threecard(self):
     hole = [Card(Card.CLUB, 3), Card(Card.CLUB, 4)]
     val = HandEvaluator.THREECARD | (5 << 4) | 0
     self.false(ContributionChecker.check(hole, val))
     val = HandEvaluator.THREECARD | (3 << 4) | 0
     self.true(ContributionChecker.check(hole, val))
     val = HandEvaluator.THREECARD | (4 << 4) | 0
     self.true(ContributionChecker.check(hole, val))
예제 #2
0
 def test_onepair(self):
     hole = [Card(Card.CLUB, 3), Card(Card.CLUB, 4)]
     val = HandEvaluator.ONEPAIR | (5 << 4) | 0
     self.false(ContributionChecker.check(hole, val))
     val = HandEvaluator.ONEPAIR | (4 << 4) | 0
     self.true(ContributionChecker.check(hole, val))
     val = HandEvaluator.ONEPAIR | (3 << 4) | 0
     self.true(ContributionChecker.check(hole, val))
예제 #3
0
 def test_twopair(self):
     hole = [Card(Card.CLUB, 3), Card(Card.CLUB, 4)]
     val = HandEvaluator.TWOPAIR | (14 << 4) | 5
     self.false(ContributionChecker.check(hole, val))
     val = HandEvaluator.TWOPAIR | (14 << 4) | 3
     self.true(ContributionChecker.check(hole, val))
     val = HandEvaluator.TWOPAIR | (3 << 4) | 14
     self.true(ContributionChecker.check(hole, val))
예제 #4
0
 def test_straight(self):
     hole = [Card(Card.CLUB, 7), Card(Card.CLUB, 8)]
     val = HandEvaluator.STRAIGHT | (6 << 4) | 0
     self.true(ContributionChecker.check(hole, val))
     val = HandEvaluator.STRAIGHT | (8 << 4) | 0
     self.false(ContributionChecker.check(hole, val))
     val = HandEvaluator.STRAIGHT | (3 << 4) | 0
     self.false(ContributionChecker.check(hole, val))
 def test_predict_on_flop(self):
     model = Neuralnet("flop")
     model.compile()
     hole = [Card(suit=Card.SPADE, rank=4), Card(suit=Card.SPADE, rank=2)]
     community = [
         Card(suit=Card.DIAMOND, rank=12),
         Card(suit=Card.CLUB, rank=11),
         Card(suit=Card.DIAMOND, rank=10)
     ]
     prediction = model.predict(hole, community)
     self.almosteq(0.29, prediction, 0.01)
예제 #6
0
 def to_hole_card(self, available_suits=None):
     if not available_suits:
         SUITS = np.array([2, 4, 8, 16])
         cards = []
         for rank in self.ranks:
             cards.append(Card(np.random.choice(SUITS, 1), rank))
         return cards
     cards = [
         Card(x[0], x[1]) for x in assign_suit(self.ranks, available_suits)
     ]
     # print('--')
     return cards
예제 #7
0
    def test_act__when_odds_average__call(self):
        cards = [Card(Suit.diamonds, Rank.Ace), Card(Suit.diamonds, Rank.King), ]
        community_cards = []

        def mock_estimation(cards1, community_cards1):
            if cards1 == [Card.from_str("DA"), Card.from_str("DK")] and community_cards1 == []:
                return 0.2
            raise Exception("Bad arguments passed in test")

        player = ComputerPlayer("myComputer", 100)
        player.estimate_winrate = mock_estimation
        player.money_in_pot = 0
        player.receive_cards(cards)
        player.see_community_cards(community_cards)
        decision, amount = player.act(10)
        self.assertEqual(Action.ACTION_CALL, decision)
        self.assertEqual(10, amount)
예제 #8
0
    def test_act__when_chances_to_win_small_and_check_is_available__check(self):
        cards = [Card(Suit.diamonds, Rank.r3), Card(Suit.diamonds, Rank.r9), ]
        community_cards = [Card(Suit.hearts, Rank.r6), Card(Suit.hearts, Rank.r7), Card(Suit.hearts, Rank.r8)]

        def mock_estimation(cards1, community_cards1):
            if cards1 == [Card.from_str("D3"), Card.from_str("D9")] and community_cards1 == [Card.from_str("H6"), Card.from_str("H7"), Card.from_str("H8")]:
                return 0.1
            raise Exception("Bad arguments passed in test")

        player = ComputerPlayer("myComputer", 100)
        player.estimate_winrate = mock_estimation
        player.money_in_pot = 10
        player.receive_cards(cards)
        player.see_community_cards(community_cards)
        decision, amount = player.act(10)
        self.assertEqual(Action.ACTION_CALL, decision)
        self.assertEqual(10, amount)
예제 #9
0
    def test_act__when_chances_to_win_small_and_call_is_required__fold(self):
        cards = [Card(Suit.diamonds, Rank.r2), Card(Suit.diamonds, Rank.r10), ]
        community_cards = []

        def mock_estimation(cards1, community_cards1):
            if cards1 == [Card.from_str("D2"), Card.from_str("DT")] and community_cards1 == []:
                return 0.1
            raise Exception("Bad arguments passed in test")

        player = ComputerPlayer("myComputer", 100)
        player.estimate_winrate = mock_estimation
        player.money_in_pot = 0
        player.receive_cards(cards)
        player.see_community_cards(community_cards)
        decision, amount = player.act(10)
        self.assertEqual(Action.ACTION_FOLD, decision)
        self.assertEqual(0, amount)
예제 #10
0
 def test_to_string(self):
     self.eq(str(Card(Card.CLUB, 1)), "CA")
     self.eq(str(Card(Card.CLUB, 14)), "CA")
     self.eq(str(Card(Card.CLUB, 2)), "C2")
     self.eq(str(Card(Card.HEART, 10)), "HT")
     self.eq(str(Card(Card.SPADE, 11)), "SJ")
     self.eq(str(Card(Card.DIAMOND, 12)), "DQ")
     self.eq(str(Card(Card.DIAMOND, 13)), "DK")
예제 #11
0
 def test_to_string(self):
     self.eq(str(Card(Card.CLUB, 1)), '2c')
     self.eq(str(Card(Card.CLUB, 2)), '3c')
     self.eq(str(Card(Card.HEART, 10)), 'Jh')
     self.eq(str(Card(Card.SPADE, 11)), 'Qs')
     self.eq(str(Card(Card.DIAMOND, 12)), 'Kd')
     self.eq(str(Card(Card.DIAMOND, 13)), 'Ad')
예제 #12
0
 def test_evaluate_hand(self):
     community = [
         Card(Card.CLUB, 3),
         Card(Card.CLUB, 7),
         Card(Card.CLUB, 10),
         Card(Card.DIAMOND, 5),
         Card(Card.DIAMOND, 6)
     ]
     hole = [Card(Card.CLUB, 9), Card(Card.DIAMOND, 2)]
     expected = {"hand": "HIGHCARD", "strength": 37522}
     self.eq(expected, U.evaluate_hand(hole, community))
예제 #13
0
 def test_gen_cards(self):
     self.eq([Card(rank=13, suit=4),
              Card(rank=11, suit=2)], U.gen_cards(['Ac', 'Qd']))
     self.eq(
         [Card(rank=8, suit=8), Card(rank=9, suit=4)],
         U.gen_cards(['9H', 'Tc']))
     self.eq([Card(rank=10, suit=16),
              Card(rank=12, suit=2)], U.gen_cards(['Js', 'Kd']))
예제 #14
0
 def test_gen_cards(self):
     self.eq(
         [Card(rank=1, suit=2), Card(rank=12, suit=4)],
         U.gen_cards(["CA", "DQ"]))
     self.eq(
         [Card(rank=9, suit=8), Card(rank=10, suit=2)],
         U.gen_cards(["H9", "CT"]))
     self.eq([Card(rank=11, suit=16),
              Card(rank=13, suit=4)], U.gen_cards(["SJ", "DK"]))
 def test_predict_on_river(self):
     model = Neuralnet("river")
     model.compile()
     hole = [Card(suit=Card.SPADE, rank=1), Card(suit=Card.HEART, rank=4)]
     community = [
         Card(suit=Card.SPADE, rank=2),
         Card(suit=Card.SPADE, rank=4),
         Card(suit=Card.DIAMOND, rank=4),
         Card(suit=Card.HEART, rank=1),
         Card(suit=Card.HEART, rank=5)
     ]
     prediction = model.predict(hole, community)
     self.almosteq(0.97, prediction, 0.01)
예제 #16
0
    def test_twopair2(self):
        community = [
            Card(Card.DIAMOND, 4),
            Card(Card.SPADE, 8),
            Card(Card.HEART, 4),
            Card(Card.DIAMOND, 7),
            Card(Card.CLUB, 8)
        ]
        hole = [Card(Card.CLUB, 7), Card(Card.SPADE, 5)]

        bit = HandEvaluator.eval_hand(hole, community)
        self.eq(HandEvaluator.TWOPAIR,
                HandEvaluator._HandEvaluator__mask_hand_strength(bit))
        self.eq(8, HandEvaluator._HandEvaluator__mask_hand_high_rank(bit))
        self.eq(7, HandEvaluator._HandEvaluator__mask_hand_low_rank(bit))
예제 #17
0
 def test_gen_hand_info(self):
     community = [
         Card(Card.CLUB, 3),
         Card(Card.CLUB, 7),
         Card(Card.CLUB, 10),
         Card(Card.DIAMOND, 5),
         Card(Card.DIAMOND, 6)
     ]
     hole = [Card(Card.CLUB, 9), Card(Card.DIAMOND, 2)]
     info = HandEvaluator.gen_hand_rank_info(hole, community)
     self.eq('HIGHCARD', info['hand']['strength'])
     self.eq(9, info['hand']['high'])
     self.eq(2, info['hand']['low'])
     self.eq(9, info['hole']['high'])
     self.eq(2, info['hole']['low'])
예제 #18
0
    def test_twopair(self):
        community = [
            Card(Card.CLUB, 7),
            Card(Card.CLUB, 9),
            Card(Card.DIAMOND, 2),
            Card(Card.DIAMOND, 3),
            Card(Card.DIAMOND, 5)
        ]
        hole = [Card(Card.CLUB, 9), Card(Card.DIAMOND, 3)]

        bit = HandEvaluator.eval_hand(hole, community)
        self.eq(HandEvaluator.TWOPAIR,
                HandEvaluator._HandEvaluator__mask_hand_strength(bit))
        self.eq(9, HandEvaluator._HandEvaluator__mask_hand_high_rank(bit))
        self.eq(3, HandEvaluator._HandEvaluator__mask_hand_low_rank(bit))
예제 #19
0
 def test_gen_hand_info(self):
     community = [
         Card(Card.CLUB, 3),
         Card(Card.CLUB, 7),
         Card(Card.CLUB, 10),
         Card(Card.DIAMOND, 5),
         Card(Card.DIAMOND, 6)
     ]
     hole = [Card(Card.CLUB, 9), Card(Card.DIAMOND, 2)]
     info = HandEvaluator.gen_hand_rank_info(hole, community)
     self.eq("HIGHCARD", info["hand"]["strength"])
     self.eq(9, info["hand"]["high"])
     self.eq(2, info["hand"]["low"])
     self.eq(9, info["hole"]["high"])
     self.eq(2, info["hole"]["low"])
 def test_predict_on_turn(self):
     model = Neuralnet("turn")
     model.compile()
     hole = [Card(suit=Card.CLUB, rank=1), Card(suit=Card.DIAMOND, rank=10)]
     community = [
         Card(suit=Card.HEART, rank=6),
         Card(suit=Card.HEART, rank=9),
         Card(suit=Card.DIAMOND, rank=8),
         Card(suit=Card.CLUB, rank=11)
     ]
     prediction = model.predict(hole, community)
     self.almosteq(0.50, prediction, 0.01)
예제 #21
0
    def test_eval_high_card(self):
        community = [
            Card(Card.CLUB, 3),
            Card(Card.CLUB, 7),
            Card(Card.CLUB, 10),
            Card(Card.DIAMOND, 5),
            Card(Card.DIAMOND, 6)
        ]
        hole = [Card(Card.CLUB, 9), Card(Card.DIAMOND, 2)]

        bit = HandEvaluator.eval_hand(hole, community)
        self.eq(HandEvaluator.HIGHCARD,
                HandEvaluator._HandEvaluator__mask_hand_strength(bit))
        self.eq(9, HandEvaluator._HandEvaluator__mask_hand_high_rank(bit))
        self.eq(2, HandEvaluator._HandEvaluator__mask_hand_low_rank(bit))
        self.eq(9, HandEvaluator._HandEvaluator__mask_hole_high_rank(bit))
        self.eq(2, HandEvaluator._HandEvaluator__mask_hole_low_rank(bit))
예제 #22
0
    def test_straightflush(self):
        community = [
            Card(Card.DIAMOND, 4),
            Card(Card.DIAMOND, 5),
            Card(Card.HEART, 10),
            Card(Card.HEART, 11),
            Card(Card.HEART, 12)
        ]
        hole = [Card(Card.HEART, 9), Card(Card.HEART, 13)]

        bit = HandEvaluator.eval_hand(hole, community)
        self.eq(HandEvaluator.STRAIGHTFLUSH,
                HandEvaluator._HandEvaluator__mask_hand_strength(bit))
        self.eq(13, HandEvaluator._HandEvaluator__mask_hand_high_rank(bit))
        self.eq(0, HandEvaluator._HandEvaluator__mask_hand_low_rank(bit))
        self.eq(13, HandEvaluator._HandEvaluator__mask_hole_high_rank(bit))
        self.eq(9, HandEvaluator._HandEvaluator__mask_hole_low_rank(bit))
예제 #23
0
    def test_fullhouse(self):
        community = [
            Card(Card.CLUB, 4),
            Card(Card.DIAMOND, 2),
            Card(Card.DIAMOND, 4),
            Card(Card.DIAMOND, 5),
            Card(Card.DIAMOND, 6)
        ]
        hole = [Card(Card.CLUB, 4), Card(Card.DIAMOND, 5)]

        bit = HandEvaluator.eval_hand(hole, community)
        self.eq(HandEvaluator.FULLHOUSE,
                HandEvaluator._HandEvaluator__mask_hand_strength(bit))
        self.eq(4, HandEvaluator._HandEvaluator__mask_hand_high_rank(bit))
        self.eq(5, HandEvaluator._HandEvaluator__mask_hand_low_rank(bit))
        self.eq(5, HandEvaluator._HandEvaluator__mask_hole_high_rank(bit))
        self.eq(4, HandEvaluator._HandEvaluator__mask_hole_low_rank(bit))
예제 #24
0
    def test_flush(self):
        community = [
            Card(Card.CLUB, 7),
            Card(Card.DIAMOND, 2),
            Card(Card.DIAMOND, 3),
            Card(Card.DIAMOND, 5),
            Card(Card.DIAMOND, 6)
        ]
        hole = [Card(Card.CLUB, 4), Card(Card.DIAMOND, 5)]

        bit = HandEvaluator.eval_hand(hole, community)
        self.eq(HandEvaluator.FLUSH,
                HandEvaluator._HandEvaluator__mask_hand_strength(bit))
        self.eq(6, HandEvaluator._HandEvaluator__mask_hand_high_rank(bit))
        self.eq(0, HandEvaluator._HandEvaluator__mask_hand_low_rank(bit))
        self.eq(5, HandEvaluator._HandEvaluator__mask_hole_high_rank(bit))
        self.eq(4, HandEvaluator._HandEvaluator__mask_hole_low_rank(bit))
예제 #25
0
    def test_threecard(self):
        community = [
            Card(Card.CLUB, 3),
            Card(Card.CLUB, 7),
            Card(Card.DIAMOND, 3),
            Card(Card.DIAMOND, 5),
            Card(Card.DIAMOND, 6)
        ]
        hole = [Card(Card.CLUB, 9), Card(Card.DIAMOND, 3)]

        bit = HandEvaluator.eval_hand(hole, community)
        self.eq(HandEvaluator.THREECARD,
                HandEvaluator._HandEvaluator__mask_hand_strength(bit))
        self.eq(3, HandEvaluator._HandEvaluator__mask_hand_high_rank(bit))
        self.eq(0, HandEvaluator._HandEvaluator__mask_hand_low_rank(bit))
        self.eq(9, HandEvaluator._HandEvaluator__mask_hole_high_rank(bit))
        self.eq(3, HandEvaluator._HandEvaluator__mask_hole_low_rank(bit))
예제 #26
0
    def test_straight_ace_low(self):
        community = [
            Card(Card.CLUB, 2),
            Card(Card.CLUB, 6),
            Card(Card.DIAMOND, 1),
            Card(Card.DIAMOND, 4),
            Card(Card.DIAMOND, 13)
        ]
        hole = [Card(Card.CLUB, 3), Card(Card.DIAMOND, 4)]

        bit = HandEvaluator.eval_hand(hole, community)
        self.eq(HandEvaluator.STRAIGHT,
                HandEvaluator._HandEvaluator__mask_hand_strength(bit))
        self.eq(4, HandEvaluator._HandEvaluator__mask_hand_high_rank(bit))
        self.eq(0, HandEvaluator._HandEvaluator__mask_hand_low_rank(bit))
        self.eq(4, HandEvaluator._HandEvaluator__mask_hole_high_rank(bit))
        self.eq(3, HandEvaluator._HandEvaluator__mask_hole_low_rank(bit))
예제 #27
0
    def test_fullhouse2(self):
        community = [
            Card(Card.CLUB, 3),
            Card(Card.DIAMOND, 7),
            Card(Card.DIAMOND, 3),
            Card(Card.HEART, 3),
            Card(Card.HEART, 7)
        ]

        hole = [Card(Card.SPADE, 8), Card(Card.SPADE, 7)]

        bit = HandEvaluator.eval_hand(hole, community)
        self.eq(HandEvaluator.FULLHOUSE,
                HandEvaluator._HandEvaluator__mask_hand_strength(bit))
        self.eq(7, HandEvaluator._HandEvaluator__mask_hand_high_rank(bit))
        self.eq(3, HandEvaluator._HandEvaluator__mask_hand_low_rank(bit))
        self.eq(8, HandEvaluator._HandEvaluator__mask_hole_high_rank(bit))
        self.eq(7, HandEvaluator._HandEvaluator__mask_hole_low_rank(bit))
예제 #28
0
    def test_fourcard(self):
        community = [
            Card(Card.CLUB, 3),
            Card(Card.DIAMOND, 7),
            Card(Card.DIAMOND, 3),
            Card(Card.HEART, 3),
            Card(Card.HEART, 7)
        ]

        hole = [Card(Card.SPADE, 3), Card(Card.SPADE, 8)]

        bit = HandEvaluator.eval_hand(hole, community)
        self.eq(HandEvaluator.FOURCARD,
                HandEvaluator._HandEvaluator__mask_hand_strength(bit))
        self.eq(3, HandEvaluator._HandEvaluator__mask_hand_high_rank(bit))
        self.eq(0, HandEvaluator._HandEvaluator__mask_hand_low_rank(bit))
        self.eq(8, HandEvaluator._HandEvaluator__mask_hole_high_rank(bit))
        self.eq(3, HandEvaluator._HandEvaluator__mask_hole_low_rank(bit))
예제 #29
0
import os
import sys
root = os.path.join(os.path.dirname(__file__), "..")
sys.path.append(root)
sys.path.append(os.path.join(root, "holecardhandicapper"))

from holecardhandicapper.model.neuralnet import Neuralnet
from pypokerengine.engine.card import Card

# preflop
preflop_model = Neuralnet("preflop")
preflop_model.compile()
holecard = [Card(suit=Card.HEART, rank=1), Card(suit=Card.SPADE, rank=1)]
prediction = preflop_model.predict(holecard)
print "win rate of [ holecard=%s ] is %f" % (map(str, holecard), prediction)

# flop
flop_model = Neuralnet("flop")
flop_model.compile()
holecard = [Card(suit=Card.SPADE, rank=4), Card(suit=Card.SPADE, rank=2)]
communitycard = [Card(suit=Card.DIAMOND, rank=12), Card(suit=Card.CLUB, rank=11), Card(suit=Card.DIAMOND, rank=10)]
prediction = flop_model.predict(holecard, communitycard)
print "win rate of [ holecard=%s, communitycard=%s ] is %f" % (map(str, holecard), map(str, communitycard), prediction)

# turn
turn_model = Neuralnet("turn")
turn_model.compile()
holecard = [Card(suit=Card.CLUB, rank=1), Card(suit=Card.DIAMOND, rank=10)]
communitycard = [Card(suit=Card.HEART, rank=6), Card(suit=Card.HEART, rank=9), Card(suit=Card.DIAMOND, rank=8), Card(suit=Card.CLUB, rank=11)]
prediction = turn_model.predict(holecard, communitycard)
print "win rate of [ holecard=%s, communitycard=%s ] is %f" % (map(str, holecard), map(str, communitycard), prediction)
# ## See model prediction on sample data

# In[35]:

from pypokerengine.engine.card import Card
C, D, H, S = Card.CLUB, Card.DIAMOND, Card.HEART, Card.SPADE

test_case = [[(8, D), (4, C), (13, C), (1, C), (6, C), (2, C), 0.994],
             [(3, D), (3, H), (5, H), (4, D), (5, S), (4, H), 0.11],
             [(1, C), (10, D), (6, H), (9, H), (8, D), (11, C), 0.505]]

gen_one_hot = lambda target_ids: [
    1 if i in target_ids else 0 for i in range(1, 53)
]
to_id = lambda card: card.to_id()

for card1, card2, card3, card4, card5, card6, expected in test_case:
    cards = [
        Card(rank=rank, suit=suit)
        for rank, suit in [card1, card2, card3, card4, card5, card6]
    ]
    hole = cards[:2]
    community = cards[2:]
    hole_onehot = gen_one_hot(map(to_id, hole))
    community_onehot = gen_one_hot(map(to_id, community))
    x = hole_onehot + community_onehot
    X = np.array([x])
    y = model.predict(X)[0][0]
    print "HOLE = [%s, %s], COMMUNITY = [%s, %s, %s, %s] => win_rate = { prediction=%f, expected=%f }" % tuple(
        map(str, hole) + map(str, community) + [y, expected])