-
Notifications
You must be signed in to change notification settings - Fork 0
/
learntrueskill.py
108 lines (84 loc) · 3.78 KB
/
learntrueskill.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import pytrueskill as ts
import numpy as np
import csv
import time
def load_replays(fn):
with open(fn) as fp:
csvreader = csv.reader(fp)
header = next(csvreader)
print header
replays = np.recfromcsv(fp,delimiter=',',names=header)
numPlayersInGame = (~np.isnan(replays.playerid1)).astype(np.int) + (~np.isnan(replays.playerid2)).astype(np.int)
idxok = (numPlayersInGame == 2)
idxok &= np.isfinite(replays.duration) & (replays.duration > 60)
replays = replays[idxok]
score1pos = np.isfinite(replays.score1) & (replays.score1>0)
score1nan = np.isnan(replays.score1)
score1neg = np.isfinite(replays.score1) & (replays.score1<0)
score2pos = np.isfinite(replays.score2) & (replays.score2>0)
score2nan = np.isnan(replays.score2)
score2neg = np.isfinite(replays.score2) & (replays.score2<0)
print 'outcome distribution'
print np.array([ [ np.sum(u&v) for u in [score2neg, score2nan, score2pos] ] for v in [score1pos, score1nan, score1neg] ])
print 'example replays per outcome'
print np.array([ [ np.max(replays.replayid[u&v]) if np.sum(u&v)>0 else 0 for u in [score2neg, score2nan, score2pos] ] for v in [score1pos, score1nan, score1neg] ])
idxok = ~(score1nan & score2nan)
idxok &= ~(score1pos & score2pos)
#idxok &= (~score1nan) & (~score2nan)
replays = replays[idxok]
isor = np.argsort(replays.replayid)
replays = replays[isor]
replays.score1[np.isnan(replays.score1)] = 0
replays.score2[np.isnan(replays.score2)] = 0
return replays
def save_results(results, fn):
idxOk = np.isfinite(results[:,-1])
results = results[idxOk,:]
isor = np.argsort(results[:,-1])
results = results[isor,:]
with open(fn,'w') as fp:
csvwriter = csv.writer(fp)
csvwriter.writerow(['mu','sigma','beta','tau','pdraw','L'])
csvwriter.writerows(results)
if __name__ == "__main__":
replays = load_replays('data/replaydumper/replays.csv')
nplayers = 1 + max(np.max(replays.playerid1), np.max(replays.playerid2))
pids1 = replays.playerid1.astype(np.int)
pids2 = replays.playerid2.astype(np.int)
scores12 = (replays.score1 - replays.score2).astype(np.int)
ratings = np.empty((nplayers,2),dtype=np.float)
ub = np.array([1500., 500., 500., 50., 0.1])
lb = np.array([1500., 500., 50., 1., 0.01])
N=100000
results = np.zeros((N,6),dtype=np.double) * np.nan
for n in range(N):
print n, '\r',
env = np.random.uniform(0.,1.,5)
env *= ub-lb
env += lb
ratings[:,0] = env[0]
ratings[:,1] = env[1]
r1,r2,nGames1,nGames2,L = ts.rate_1vs1(env,pids1,pids2,scores12,ratings)
idx = (nGames1>10) & (nGames2>10)
L = np.sum(np.log(L[idx]))
results[n,0:-1] = env
results[n,-1] = L
if n%100 == 99:
save_results(results, 'learntrueskill_solution_space.txt')
save_results(results, 'learntrueskill_solution_space.txt')
env = results[-1,0:5]
ratings[:,0] = env[0]
ratings[:,1] = env[1]
r1,r2,nGames1,nGames2,L = ts.rate_1vs1(env,pids1,pids2,scores12,ratings)
with open('learntrueskill_progression.txt','w') as fp:
csvwriter = csv.writer(fp)
csvwriter.writerow(['pid1','mu1','sigma1','ngames1','pid2','mu2','sigma2','ngames2','scores12','L'])
csvwriter.writerows(np.concatenate((
pids1[:,np.newaxis],r1,nGames1[:,np.newaxis],pids2[:,np.newaxis],r2,nGames2[:,np.newaxis],scores12[:,np.newaxis],L[:,np.newaxis]
), axis=1))
with open('learntrueskill_final_ratings.txt','w') as fp:
csvwriter = csv.writer(fp)
csvwriter.writerow(['pid','mu','sigma'])
csvwriter.writerows(np.concatenate((
np.arange(nplayers)[:,np.newaxis], ratings
), axis=1))