[NEWIMPORT] Copy Grigorij's code from Alchemy

Copied some of Grigorij's code verbatim for calculating additional stats, still needs adapting.

Also reorder some functions so the corresponding files are more mergeable in future.
This commit is contained in:
Worros 2009-12-23 13:30:12 +08:00
parent 355225fc25
commit 6e9153c25c

View File

@ -262,13 +262,58 @@ class DerivedStats():
for (i, street) in enumerate(hand.actionStreets[1:]):
self.hands['street%dRaises' % i] = len(filter( lambda action: action[1] in ('raises','bets'), hand.actions[street]))
def calcCBets(self, hand):
# Continuation Bet chance, action:
# Had the last bet (initiative) on previous street, got called, close street action
# Then no bets before the player with initiatives first action on current street
# ie. if player on street-1 had initiative
# and no donkbets occurred
def calcSteals(self, hand):
"""Fills stealAttempt(Chance|ed, fold(Bb|Sb)ToSteal(Chance|)
Steal attemp - open raise on positions 2 1 0 S - i.e. MP3, CO, BU, SB
Fold to steal - folding blind after steal attemp wo any other callers or raisers
"""
if self.gametype_dict['base'] != 'hold':
# FIXME: add support for other games //grindi
return
steal_attemp = False
for action in hand.actions[hand.actionStreets[1]]:
hp, act = self.handplayers_by_name[action[0]], action[1]
#print action[0], hp.position, steal_attemp, act
if hp.position == 'B':
hp.foldBbToStealChance = steal_attemp
hp.foldBbToSteal = hp.foldBbToStealChance and act == 'folds'
break
elif hp.position == 'S':
hp.foldSbToStealChance = steal_attemp
hp.foldSbToSteal = hp.foldSbToStealChance and act == 'folds'
if steal_attemp and act != 'folds':
break
if hp.position in ('2', '1', '0', 'S') and not steal_attemp:
hp.stealAttemptChance = True
if act in ('bets', 'raises'):
hp.stealAttempted = True
steal_attemp = True
def calc34BetStreet0(self, hand):
"""Fills street0_(3|4)B(Chance|Done), other(3|4)BStreet0"""
bet_level = 1 # bet_level after 3-bet is equal to 3
for action in hand.actions[hand.actionStreets[1]]:
# FIXME: fill other(3|4)BStreet0 - i have no idea what does it mean
hp, aggr = self.handplayers_by_name[action[0]], action[1] in ('raises', 'bets')
hp.street0_3BChance = bet_level == 2
hp.street0_4BChance = bet_level == 3
hp.street0_3BDone = aggr and (hp.street0_3BChance)
hp.street0_4BDone = aggr and (hp.street0_4BChance)
if aggr:
bet_level += 1
def calcCBets(self, hand):
"""Fill streetXCBChance, streetXCBDone, foldToStreetXCBDone, foldToStreetXCBChance
Continuation Bet chance, action:
Had the last bet (initiative) on previous street, got called, close street action
Then no bets before the player with initiatives first action on current street
ie. if player on street-1 had initiative and no donkbets occurred
"""
# XXX: enumerate(list, start=x) is python 2.6 syntax; 'start'
# came there
#for i, street in enumerate(hand.actionStreets[2:], start=1):
@ -280,6 +325,29 @@ class DerivedStats():
if chance == True:
self.handsplayers[name]['street%dCBDone' % (i+1)] = self.betStreet(hand.actionStreets[i+2], name)
def calcCheckCallRaise(self, hand):
"""Fill streetXCheckCallRaiseChance, streetXCheckCallRaiseDone
streetXCheckCallRaiseChance = got raise/bet after check
streetXCheckCallRaiseDone = checked. got raise/bet. didn't fold
CG: CheckCall would be a much better name for this.
"""
for i, street in enumerate(hand.actionStreets[2:], start=1):
actions = hand.actions[hand.actionStreets[i]]
checkers = set()
initial_raiser = None
for action in actions:
pname, act = action[0], action[1]
if act in ('bets', 'raises') and initial_raiser is None:
initial_raiser = pname
elif act == 'check' and initial_raiser is None:
checkers.add(pname)
elif initial_raiser is not None and pname in checkers:
hp = self.handplayers_by_name[pname]
setattr(hp, 'street%dCheckCallRaiseChance' % i, True)
setattr(hp, 'street%dCheckCallRaiseDone' % i, act!='folds')
def seen(self, hand, i):
pas = set()
for act in hand.actions[hand.actionStreets[i+1]]:
@ -333,6 +401,27 @@ class DerivedStats():
players.add(action[0])
return players
def firstsBetOrRaiser(self, actions):
"""Returns player name that placed the first bet or raise.
None if there were no bets or raises on that street
"""
for act in actions:
if act[1] in ('bets', 'raises'):
return act[0]
return None
def lastBetOrRaiser(self, street):
"""Returns player name that placed the last bet or raise for that street.
None if there were no bets or raises on that street"""
lastbet = None
for act in self.hand.actions[street]:
if act[1] in ('bets', 'raises'):
lastbet = act[0]
return lastbet
def noBetsBefore(self, street, player):
"""Returns true if there were no bets before the specified players turn, false otherwise"""
betOrRaise = False
@ -345,6 +434,7 @@ class DerivedStats():
break
return betOrRaise
def betStreet(self, street, player):
"""Returns true if player bet/raised the street as their first action"""
betOrRaise = False
@ -353,14 +443,4 @@ class DerivedStats():
betOrRaise = True
else:
break
return betOrRaise
def lastBetOrRaiser(self, street):
"""Returns player name that placed the last bet or raise for that street.
None if there were no bets or raises on that street"""
lastbet = None
for act in self.hand.actions[street]:
if act[1] in ('bets', 'raises'):
lastbet = act[0]
return lastbet