def analyse_showdown(self, ranges, order, is_passive, userids): """ Create a showdown with given userids. Pre-river if pre-river. """ showdowns = self.session.query(GameHistoryShowdown) \ .filter(GameHistoryShowdown.gameid == self.game.gameid) \ .filter(GameHistoryShowdown.order == order) \ .filter(GameHistoryShowdown.is_passive == is_passive).all() assert len(showdowns) == 1 logging.debug("gameid %d, order %d, confirmed existing showdown", self.game.gameid, order) showdown = showdowns[0] # TODO: REVISIT: this ignores ranges of folded players # It might make a difference in situations where a player has (for # example) limited their range to Ax and later folded, hence surely # removing an ace from the deck for the other players (significantly # changing their equities) # Actually, where it makes a difference, it would be really neat to see # it. Imagine someone saying "hey, this stupid site says I made a bad # call here with 23% equity when really I had 32% equity and it was a # great call!" Well no actually, the card removal effects of the folded # players change your equity, and you suck at poker. range_map = {k: v for k, v in ranges.iteritems() if k in userids} equity_map, iterations = showdown_equity(range_map, self.game.board) logging.debug('gameid %d, order %d, is_passive %r, factor %0.8f, ' 'showdown with userids: %r, equity: %r ' '(iterations %d)', self.game.gameid, order, is_passive, showdown.factor, userids, equity_map, iterations) existing_equities = {p.showdown_order: p for p in showdown.participants} #pylint:disable=no-member for showdown_order, userid in enumerate(userids): # create if not exist, otherwise update if showdown_order in existing_equities: participant = existing_equities[showdown_order] else: # TODO: REVISIT: this is ordered by situation player order, # not showdown order participant = GameHistoryShowdownEquity() self.session.add(participant) existing_equities[showdown_order] = participant participant.gameid = self.game.gameid participant.order = order participant.is_passive = is_passive participant.showdown_order = showdown_order participant.userid = userid participant.equity = equity_map[userid] self.showdown_payments(showdown=showdown, equities=existing_equities.values())