class_docstr: This is a bot that plays pretty well (~ 0.75 winrate against GPT-4), but not very well.
  
  We now don't need a very strong bot, this is the best one we could implement in less than a day of work.
  
  Brief strategy summary:
  * In the first move there is a chance of a low random bid. The weaker the hand, the higher the chance.
  * If not first move or first move and not bluffing:
      *   If we hold a high-enough combination in hand, we bid it (if there are multiple, we bid the lowest)
      *   If not, we simulate possible opponent's hands, assuming that hands with more cards matching
          their last bid are more likely. We take the action that wins for the largest (weighted) number
          of opponent's hands.
          *   NOTE: We ignore the fact that some cards declared by the opponent might be our cards, e.g.
                    if we open with 'AA' and they respond with 'AAA' then we treat this the same way
                    as if they had opened with 'AAA'. This is how we often lose against GPT-4.
  
  This strategy works pretty well against GPT-4, but has a pretty strong counterstrategy (bid pure-bluff high bids,
  call bluff only when your opponent raises your bluff).
class_docstr_tok: ["This","is","a","bot","that","plays","pretty","well","(","~","0.75","winrate","against","GPT-4",")",",","but","not","very","well",".","We","now","do","n't","need","a","very","strong","bot",",","this","is","the","best","one","we","could","implement","in","less","than","a","day","of","work",".","Brief","strategy","summary",":","*","In","the","first","move","there","is","a","chance","of","a","low","random","bid",".","The","weaker","the","hand",",","the","higher","the","chance",".","*","If","not","first","move","or","first","move","and","not","bluffing",":","*","If","we","hold","a","high-enough","combination","in","hand",",","we","bid","it","(","if","there","are","multiple",",","we","bid","the","lowest",")","*","If","not",",","we","simulate","possible","opponent","'s","hands",",","assuming","that","hands","with","more","cards","matching","their","last","bid","are","more","likely",".","We","take","the","action","that","wins","for","the","largest","(","weighted",")","number","of","opponent","'s","hands",".","*","NOTE",":","We","ignore","the","fact","that","some","cards","declared","by","the","opponent","might","be","our","cards",",","e.g",".","if","we","open","with","'AA","'","and","they","respond","with","'AAA","'","then","we","treat","this","the","same","way","as","if","they","had","opened","with","'AAA","'",".","This","is","how","we","often","lose","against","GPT-4",".","This","strategy","works","pretty","well","against","GPT-4",",","but","has","a","pretty","strong","counterstrategy","(","bid","pure-bluff","high","bids",",","call","bluff","only","when","your","opponent","raises","your","bluff",")","."]
code: def _honest_bid(self):
      winning_hands = get_all_winning_hands(self.cards)
      if self.game.rounds[-1].moves:
          last_move = self.game.rounds[-1].moves[-1][1]
          winning_hands = [
              bid for bid in winning_hands if bid > last_move
          ]
      if winning_hands:
          return winning_hands[0]
      else:
          return self._bid_higher_or_call_bluff()
  
imports: from collections import defaultdict
  import numpy
  from evals.elsuite.bluff.bluff.cards import CARDS, PlayerCards, get_all_winning_hands, get_bluff_move
  from evals.elsuite.bluff.bluff.game import Game
label_desc: Use image node_id 4 for calling the StrongBot obj's underlying member method code with example usage: obj._honest_bid() and returns: winning_hands, self