def lookupTransitionProbs( final_street, final_board ) :
    if final_street == 0 :
        print "preflop, no transitions to return"
        return False

    trans_lookup = {"01" : -1, \
                    "12" : -1, \
                    "23" : -1 }
    #TODO: compute TRANSITIONS_FLOP
    for street in range(1,final_street+1) :
        board = final_board[:street+2]
        #if turn or river
        if street > 1 :
            cboardp = deck.collapseBoard( board )
            cboard = deck.collapseBoard( board[:-1] )
            cboards = "%s|%s" % (cboard,cboardp)
        elif street == 1 :
            cboards = deck.collapseBoard( board )

        street_name = globles.int2streetname( street )
        query = """select dist
                   from TRANSITIONS_%s
                   where cboards = '%s'""" % \
                   (street_name.upper(), cboards)
        #print query
        dist = conn.queryScalar( query, str )
        dist = [[float(p) for p in line.split(',')] \
                for line in dist.split(';')]
        lookup_name = "%d%d" % (street-1, street)
        trans_lookup[lookup_name] = dist
    return trans_lookup
def iterateTransitions() :
    #2529 insterting into flop trans
    transitions = {}
    conn = db.Conn("localhost")
    street = 'river'
    len_street = 5
    #permutations v combinations is important for transitions because the 
    #way in which you go from 3 to 4 card board matters
    for i, board_prime in enumerate( permutations( range(52), len_street ) ):
        #12508.pts-1.genomequery
        if i < 0 or i >= 60000000  : continue

        #10866.pts-1.genomequery
        #if i < 60000000 or i >= 120000000: continue

        #12481.pts-3.genomequery
        #if i < 120000000 or i >= 180000000: continue  #finished

        #12526.pts-3.genomequery
        #if i < 180000000 or i >= 240000000: continue

        #12635.pts-3.genomequery
        #if i < 240000000 : continue

        #print i
        #deprecated
        if street == 'flop' :
            cboards = cboard_prime
        else :
            board = board_prime[:-1]
            cboard = collapseBoard(board)
            cboard_prime = collapseBoard(board_prime)
        cboards = "%s|%s" % (cboard, cboard_prime)


        #print board_prime
        #better but untested in this context
        cboard,cboardp = board2cboards( board_prime, globles.streetname2Int(street)  )
        cboards = canonicalizeCboards( cboard, cboardp )

        ##until tested
        #assert False

        if cboards not in transitions :
            transitions[cboards] = True

            q = "select count(*) from TRANSITIONS_%s where cboards = '%s'" % \
                 (street.upper(),cboards)
            count = conn.queryScalar(q, int)
            if count == 0 :
                print "missing: ", cboards
                computeBucketTransitions( conn, cboard, cboard_prime )
            else :
                print "skipping:", cboards

    print len(transitions)       
def computeEHS2DistsLongways_special() :
    pool = Pool( processes = 8 )
    count = 0
    timea = time()

    for board_size in range(4,5) :
        start_time = time()

        already_repped = {}

        if board_size == 3 :  
            street_name = 'flops'
            print_every = 10
        elif board_size == 4 : 
            street_name = 'turns'
            print_every = 100
        else : 
            street_name = 'rivers'
            print_every = 1000
        count = 0

        for board in combinations( range(52), board_size ) :
            cboard = collapseBoard( board )
            if cboard.endswith( "_p_22f" ) and cboard not in already_repped :
                d_pocket_EHS2 = rollout.mapReduceComputeEHS2( pool,list(board) )
                filename = "hsdists/%s/%s.hsdist" % (street_name, cboard)
                fout = open( filename, 'w' )
                fout.write( json.dumps( d_pocket_EHS2 ) )
                fout.close()
                already_repped[cboard] = makeHuman(board)
            else :
                pass

            count += 1
            if count % print_every == 0 :
                print "board_size: ", board_size, " count: ", count
                print "time: ", time() - timea 
                timea = time()

        fout = open("hsdists/%s/special_representatives.txt" % street_name, 'w' )
        fout.write( json.dumps( already_repped ) )
        fout.close()

        print "time for board_size: ", board_size, " was: ", time() - start_time

    pool.close()
def computeDists(num_known_board, EV_or_HS) :
    already_seen = {}
    count = 0
    
    if num_known_board == 3 : street = 'flops'
    elif num_known_board == 4 : street = 'turns'
    elif num_known_board == 5 : street = 'rivers'
    else : assert False

    for board in combinations( d.cards, num_known_board ) :
        collapsed = collapseBoard( board )
        if EV_or_HS == 'EV' :
            path = "evdists/%s/%s.evdist" % (street,collapsed)
        else :
            path = "hsdists/%s/%s.hsdist" % (street,collapsed)

        if collapsed in already_seen or exists(path) : 
            continue
        else :
            print count, collapsed
            count += 1
            board = makeHuman(board) + ['__']*(5-num_known_board)
            
            x = []
            if EV_or_HS == 'EV' :
                d_pocket_EV = rollout.computeEVs( [], board, 2, num_threads=4 )
                for ev in d_pocket_EV.values() :
                    x.append( makeRound( ev ) )
            else :
                d_pocket_HS = rollout.computeHSs( board, num_threads=4 )
                for hs in d_pocket_HS.values() :
                    x.append( hs )

            x.sort()
            
            fout = open(path, 'w')
            fout.write( "%s\n" % ';'.join([str(t) for t in x]) )
            fout.close()

            already_seen[collapsed] = True
Beispiel #5
0
    def registerRevealedPockets(self, player_names, pockets):
        # TODO: handle preflop strength via some table
        for street in range(self.street):
            # for street in range(len(self.past_actions)) :
            self.buckets.append([0] * len(player_names))
            for player_name, pocket in zip(player_names, pockets):
                pix = self.players.index(player_name)
                if street == 0:
                    street_name = "preflop"
                    q = """select memberships 
                           from %s%s
                           where pocket = '%s'""" % (
                        BUCKET_TABLE_PREFIX,
                        street_name.upper(),
                        canonicalize(pocket),
                    )
                else:
                    if street == 1:
                        board = self.board[:3]
                        street_name = "flop"
                    elif street == 2:
                        board = self.board[:4]
                        street_name = "turn"
                    elif street == 3:
                        board = self.board
                        street_name = "river"

                    cboard = collapseBoard(board)
                    q = """select aboard
                           from REPRESENTATIVES
                           where cboard = '%s'""" % (
                        cboard
                    )
                    # print q
                    try:
                        [[aboard]] = self.conn.query(q)
                    except Exception as ve:
                        self.ratio_file.write("%s\n\n" % q)

                    aboard = listify(aboard)

                    # pocket:board::apocket:aboard
                    # print "board",board
                    # print "aboard", aboard
                    apocket = symmetricComplement(board, pocket, aboard)
                    # apocket = 'AhAs'
                    # print "pocket",pocket
                    # print "apocket", apocket

                    q = """select memberships
                           from %s%s
                           where cboard = '%s' and pocket = '%s'""" % (
                        BUCKET_TABLE_PREFIX,
                        street_name.upper(),
                        cboard,
                        apocket,
                    )

                # print  q
                try:
                    [[memberships]] = self.conn.query(q)
                except Exception as ve:
                    message = "cboard: %s\naboard: %s\npocket: %s\n\n" % (cboard, aboard, pocket)
                    self.ratio_file.write(message)
                    ve.message = message
                    raise ve

                # TODO
                # eventually the beliefs should be a continuous node,
                # for now let's just
                # cram it into the closest to the average
                memberships = [float(t) for t in memberships.split(":")]
                # print "memberships: ", memberships
                # print "membs", memberships
                # we want the buckets to be from 1->N, not 0->N-1
                w = [(i + 1) * m for i, m in enumerate(memberships)]
                # print "w:", w
                bucket = int(round(sum(w)))
                # print "bucket,", bucket

                self.buckets[street][pix] = bucket
def testSymmetric() :
    conn  = db.Conn("localhost")
    tests = []
    #cboard is 455_p_r
    #representative is 4h5d5c
    board = ['4d','5h','5c']
    pocket = ['5d','7s']
    tests.append( (board,pocket,'FLOP') )

    #cboard is 9TQ_h_2fxox
    #rep is 9hQhTd
    board = ['9s','Qs','Tc']
    pocket = ['7h','Th']
    tests.append( (board,pocket,'FLOP') )

    #cboard is 34QK_h_3foxxx
    #rep is 3h3dQdKd
    board = ['3s','3h','Qh','Kh']
    pocket = ['7h','Tc']
    tests.append( (board, pocket, 'TURN') )

    #cboard is
    #rep is   2h   4h   7d   9d   Ad
    board = ['2c','4h','7d','9h','Ah']
    pocket = ['3c','Kh']
    tests.append( (board,pocket,'RIVER') ) 

    #cboard is 2335K_p_4f
    #2h3h5hKh3d
    board = ['2c','3d','3c','5c','Kc']
    pocket = ['5s','Qc']
    tests.append( (board,pocket,'RIVER') )

    board = ['5c','5d','7c','7d','Qs']
    pocket = ['6c','Qh']
    tests.append( (board,pocket,'RIVER') )

    for (board,pocket,street_name) in tests :

        cboard = collapseBoard( board )
        #print "cboard", cboard
        q = """select aboard from REPRESENTATIVES where cboard = '%s'""" % \
                (cboard)
        [[aboard]] = conn.query(q)
        #print "board", board
        #print "aboard", listify(aboard)
        #print "pocket", pocket

        pocketp = listify( symmetricComplement( board, \
                                                pocket,\
                                                listify(aboard) ) )

        #print "pocketp: " , pocketp
        ehs2 = rollout.computeSingleEHS2( pocket, board )
        print ehs2
        q = """select ehs2 from EHS2_%s
               where cboard = '%s' and pocket = '%s'""" % (street_name, \
                                                           cboard, \
                                                           canonicalize(pocketp) )
        [[ehs2p]] = conn.query(q)
        ehs2p = float(ehs2p)
        print ehs2p
        assert round(ehs2,4) == round(ehs2p,4)
def sampleTransitionProbs( street, n_samples, bucket_percentiles ) :
    pool = Pool( processes = 4 )
    dirname = "hsdists/%ss" % street

    fout1 = open( "%s/transition_names.txt" % dirname, 'w' )
    fout2 = open( "%s/transition_probs.txt" % dirname, 'w' )
    write_buffer_1 = []
    write_buffer_2 = [] # [[cboard, cboard', tran probs],[],...]

    fin = open( "%s/collapsed_representatives.txt" % dirname )
    representatives = load( fin.read() )
    fin.close()

    bkt_filenames = ["%s/%s" % (dirname, file) \
                      for file in listdir( dirname ) \
                      if file.endswith('bkts')]

    dek = Deck()
    for bkt_filename in sample( bkt_filenames, n_samples ) :
        timea = time()
        fin = open( bkt_filename) 
        d_pocket_buckets = load( fin.read() )
        fin.close()

        [rest,fileext] = bkt_filename.rsplit('/',1)
        [file,ext] = fileext.rsplit('.',1)

        actual_board = [str(t) for t in representatives[file]]
        dek.remove( actual_board )

        #enumerate the possible collapsed flops
        d_cboard_aboard = {}
        for next_card in dek.cards :
            aboard = actual_board + makeHuman([next_card])
            cboard = collapseBoard( aboard )
            if cboard not in d_cboard_aboard :
                d_cboard_aboard[cboard] = aboard


        for cboard in d_cboard_aboard :
            print bkt_filename, aboard
            aboard = d_cboard_aboard[cboard]
            d_pocket_EHS2 = rollout.mapReduceComputeEHS2( pool, aboard )
            d_pocket_buckets_prime = computeBucket( d_pocket_EHS2, bucket_percentiles[street] )

            n_buckets = len(bucket_percentiles[street])
            if street == "flop" :
                n_buckets_prime = len(bucket_percentiles['turn'])
            elif street == 'turn' :
                n_buckets_prime = len(bucket_percentiles['river'])
            else : assert False

            #print actual_board, aboard
            tprobs = getTransitionProbs( d_pocket_buckets, \
                                      n_buckets, \
                                      d_pocket_buckets_prime, \
                                      n_buckets_prime )
            prob_vector = []
            for b in range(n_buckets) :
                for bprime in range(n_buckets_prime) :
                    if b in tprobs and bprime in tprobs[b] :
                        prob_vector.append( tprobs[b][bprime] )
                    else :
                        prob_vector.append( 0.0 )

            #write_buffer_1.append( "%s\t%s" % (file,cboard) )
            fout1.write( "%s\t%s\n" % (file,cboard) )
            fout2.write( dump( prob_vector, width=6000 )[1:-2] + "\n" )
            #write_buffer_2.append ( prob_vector )


        #print bkt_filename
        #print len(d_cboard_aboard)
        dek.shuffle()
        #fout1.write( dump( write_buffer_1 ) )
        #fout2.write( dump( write_buffer_2, width=5000 )[2:] )
        #write_buffer_1 = []
        #write_buffer_2 = []
        timeb = time()
        print "board: ", bkt_filename, " took: ", timeb-timea

    pool.close()
def computeEHS2Dists() :
    already_repped = set([])
    results = {}   
    count = 0
    a = time()
    for board in combinations( range(52), 5 ) :
        count += 1
        if count % 100 == 0 : 
            print count
            print time() - a
            a = time()
        
        #pit every possible hand against 'mystery' known_pocket
        #and compute the HS2 from rollout
        known_pockets = ['__','__']
        d_pocket_HS2 = rollout.mapReduceComputeEHS2( list(board) )


        flop = ''.join( makeHuman(board[0:3]) )
        cflop = collapseBoard( flop )
        turn = ''.join( makeHuman(board[0:4]) ) 
        cturn = collapseBoard( turn )
        river = ''.join( makeHuman(board) )
        if river == '2s2c3s4s5s' :
            print d_pocket_HS2
            assert False
        criver =collapseBoard( river )

        streets = [flop,turn,river]
        cstreets = [cflop, cturn, criver]

        for street, cstreet in zip(streets[:2],cstreets[:2]) :
            if cstreet not in already_repped and street not in results :
                results[street] = {}

        for cstreet in cstreets :
            already_repped.add( cstreet )

        
        #rounding precision
        precision = 4
        #collect the HS2 for the river
        river_hs2 = {} 
        for pocket in d_pocket_HS2 :
            hs2 = d_pocket_HS2[pocket]
            #flop and turn
            for street in streets[:2] :
                if street in results :
                    if pocket not in results[street] :
                        results[street][pocket] = [hs2,1]
                    else :
                        results[street][pocket][0] += hs2
                        results[street][pocket][1] += 1
                else :
                    pass
                    #already_repped

            river_hs2[pocket] =makeRound(hs2,precision)
           
        #the 5 card board is unique, so we can print out right away
        name = "hsdists/rivers/%s.hsdist" % criver
        if not exists(name) :
            friver = open( name, 'w' )
            friver.write( json.dumps( river_hs2 ) )
            #friver.write( ";".join( [str(t) for t in sorted(river_hs2)] ) + "\n" )
            friver.close()
            pass

        if count == 500 :
            #fout = open("test.txt",'w')
            #fout.write( json.dumps(results) )
            #fout.close()
            break
            pass
    
    print "printing"
    #once all the boards are done, have results[board][pocket] = HS2sum, count
    for board in results :
        collapsed_board = collapseBoard( board )
        num_cards = len(collapsed_board.split('_')[0])
        if num_cards == 3 :   street_name = 'flops'
        elif num_cards == 4 : street_name = 'turns'
        else: assert False

        #print "collapsed name:", collapsed_board, " street name: " , street_name

        d_pocket_EHS2 = {}
        for pocket in results[board] :
            (HS2sum, count) = results[board][pocket]
            ehs2 = makeRound( HS2sum / count, precision )
            d_pocket_EHS2[pocket] = ehs2

        filename = "hsdists/%s/%s.hsdist" % (street_name, collapsed_board)
        fout = open( filename, 'w' )
        #print "len HS2s: ", len(HS2s)
        fout.write( json.dumps( d_pocket_EHS2 ) )
        #fout.write( ';'.join( [str(t) for t in sorted(HS2s)] )+"\n" )
        fout.close()

#chunked version that is not any faster, you dolt
#def iterateTransitions() :
    #transitions = {}
    #conn = db.Conn("localhost")
    #street = 'turn'
    #street_prime = 'river'
#
    #chunk_size = 100
    #cboards_chunk = []
    #for i, board_prime in enumerate( combinations( range(52), 5 ) ):
        ##19148.pts-5.genomequery
        ##if i < 59601 or i >= 500000: continue
#
        ##2529.pts-4.genomequery
        ##if i < 535098 or i >= 1000000: continue
        #if i < 600000 : continue
#
        ##3567.pts-4.genomequery
        ##if i < 1000056 or i >= 1500000: continue  #finished
        #if i < 2300000 : continue

        #3601.pts-4.genomequery
        #if i < 1507912 or i >= 2000000: continue

        #3718.pts-4.genomequery
        #if i < 2000007 : continue

        print i
                
        if len(cboards_chunk) == chunk_size :
            cboard_where = []
            cboard_prime_where = []
            for cboards in cboards_chunk :
                cboard, cboard_prime = cboards.split('|')
                cboard_where.append("cboard = '%s'" % cboard )
                cboard_prime_where.append( "cboard = '%s'" % cboard_prime )
            cboard_where = ' or '.join( cboard_where )
            cboard_prime_where = ' or '.join( cboard_prime_where )

            #query
            q_prime = """select pocket, memberships
                   from %s%s
                   where %s""" % \
                   (globles.BUCKET_TABLE_PREFIX, \
                    street_prime.upper(), \
                    cboard_prime_where)
            q = """select pocket, memberships
                   from %s%s
                   where %s""" % \
                   (globles.BUCKET_TABLE_PREFIX, \
                    street.upper(), \
                    cboard_where)

            print q_prime

            for pocket, memb in conn.query( q_prime ) :
                pass
            for pocket, memb in conn.query( q ) :
                pass
            for cboards in cboards_chunk :
                #build select dictionary
                #computeBucketTransitions( conn, cboard, cboard_prime )
                pass

            cboards_chunk = []
            a = raw_input()


        board = board_prime[:-1]
        cboard = collapseBoard(board)
        cboard_prime = collapseBoard(board_prime)
        cboards =  "%s|%s" % (cboard, cboard_prime)
        q = "select count(*) from TRANSITIONS where cboards = '%s'" % cboards
        count = conn.queryScalar(q, int)
        if count > 0 :
            cboards_chunk.append( cboards )
        else :
            print "skipping", cboards

    print len(transitions)