def __init__(self, dbpl=None, bos=None, s1=None, s2=None): if dbpl is None: return sipl = [make_player(p) for p in dbpl] num = bos[0] obj = MatchSim(num) obj.set_players(sipl) obj.modify(self.range(int(s1), 0, num), self.range(int(s2), 0, num)) obj.compute() self.dbpl = dbpl self.bos = bos self.sipl = sipl self.num = num self.obj = obj self.pla, self.plb = dbpl[0], dbpl[1] self.rta = sipl[0].elo_vs_opponent(sipl[1]) self.rtb = sipl[1].elo_vs_opponent(sipl[0]) self.proba = obj.get_tally()[sipl[0]][1] self.probb = obj.get_tally()[sipl[1]][1] self.sca = s1 self.scb = s2 self.outcomes = [ {'sca': outcome[1], 'scb': outcome[2], 'prob': outcome[0]} for outcome in obj.instances_detail() ]
def __init__(self, dbpl=None, bos=None, args=None): if dbpl is None: return prefixes = '12wlf' rounds = [ (_('Intial round'), '12'), (_('Winners\' and losers\' matches'), 'wl'), (_('Final match'), 'f'), ] self.bos = bos self.dbpl = dbpl sipl = [make_player(p) for p in dbpl] num = bos[0] obj = MSLGroup(num) obj.set_players(sipl) self.update_matches(obj, prefixes, args) obj.compute() players = list(sipl) for p in players: p.tally = obj.get_tally()[p][::-1] for i in range(3, -1, -1): players.sort(key=lambda p: p.tally[i], reverse=True) self.table = [ {'player': self.player_data(p.dbpl), 'probs': p.tally} for p in players ] self.matches = self.create_matches(obj, rounds) self.meanres = self.create_median_matches(obj, rounds)
def __init__(self, dbpl=None, bos=None, args=None): if dbpl is None: return prefixes = '12wlf' rounds = [ (_('Intial round'), '12'), (_('Winners\' and losers\' matches'), 'wl'), (_('Final match'), 'f'), ] self.bos = bos self.dbpl = dbpl sipl = [make_player(p) for p in dbpl] num = bos[0] obj = MSLGroup(num) obj.set_players(sipl) self.update_matches(obj, prefixes, args) obj.compute() players = list(sipl) for p in players: p.tally = obj.get_tally()[p][::-1] for i in range(3, -1, -1): players.sort(key=lambda p: p.tally[i], reverse=True) self.table = [{ 'player': self.player_data(p.dbpl), 'probs': p.tally } for p in players] self.matches = self.create_matches(obj, rounds) self.meanres = self.create_median_matches(obj, rounds)
def __init__(self, dbpl=None, bos=None, s1=None, s2=None): if dbpl is None: return sipl = [make_player(p) for p in dbpl] num = bos[0] obj = MatchSim(num) obj.set_players(sipl) obj.modify(self.range(int(s1), 0, num), self.range(int(s2), 0, num)) obj.compute() self.dbpl = dbpl self.bos = bos self.sipl = sipl self.num = num self.obj = obj self.pla, self.plb = dbpl[0], dbpl[1] self.rta = sipl[0].elo_vs_opponent(sipl[1]) self.rtb = sipl[1].elo_vs_opponent(sipl[0]) self.proba = obj.get_tally()[sipl[0]][1] self.probb = obj.get_tally()[sipl[1]][1] self.sca = s1 self.scb = s2 self.outcomes = [{ 'sca': outcome[1], 'scb': outcome[2], 'prob': outcome[0] } for outcome in obj.instances_detail()]
def pred_4pswiss(request): base = base_ctx('Predict', 'Predict', request=request) dbpl = [get_object_or_404(Player, id=int(i)) for i in request.GET['ps'].split(',')] sipl = [make_player(pl) for pl in dbpl] num = (int(request.GET['bo'])+1)/2 obj = mslgroup.MSLGroup(num) obj.set_players(sipl) def update(request, obj, match, r1, r2): if r1 in request.GET and r2 in request.GET: try: if obj.get_match(match).can_modify(): obj.get_match(match).modify(int(request.GET[r1]), int(request.GET[r2])) except: pass update(request, obj, 'first', '11', '12') update(request, obj, 'second', '21', '22') update(request, obj, 'winners', '31', '32') update(request, obj, 'losers', '41', '42') update(request, obj, 'final', '51', '52') obj.compute() tally = obj.get_tally() players = list(sipl) for p in players: p.tally = tally[p] for i in range(0, 4): players.sort(key=lambda p: p.tally[i], reverse=True) base['players'] = players MatchObj = namedtuple('MatchObj', 'obj pla plb modded canmod fixed sca scb') matches = [] for mname in ['first', 'second', 'winners', 'losers', 'final']: match = obj.get_match(mname) matches.append(MatchObj(match, match.get_player(0).dbpl, match.get_player(1).dbpl,\ match.is_modified(), match.can_modify(), match.is_fixed(), match._result[0], match._result[1])) base['matches'] = matches MeanRes = namedtuple('MeanRes', 'pla plb sca scb') meanres = [] for mname in ['first', 'second', 'winners', 'losers', 'final']: match = obj.get_match(mname) match.compute() lsup = match.find_lsup() meanres.append(MeanRes(match.get_player(0).dbpl, match.get_player(1).dbpl, lsup[1], lsup[2])) match.broadcast_instance((0, [lsup[4], lsup[3]], match)) base['meanres'] = meanres base['ps'] = request.GET['ps'] base['bo'] = request.GET['bo'] fpswiss_postable(base, obj, players, url='http://aligulac.com/predict/4pswiss/?bo=%s&ps=%s' % (base['bo'], base['ps'])) return render_to_response('pred_4pswiss.html', base)
def pred_proleague(request): base = base_ctx('Predict', 'Predict', request=request) dbpl = [get_object_or_404(Player, id=int(i)) for i in request.GET['ps'].split(',')] sipl = [make_player(pl) for pl in dbpl] num = (int(request.GET['bo'])+1)/2 nplayers = len(sipl) obj = teampl.TeamPL(num) obj.set_players(sipl) def update(request, obj, match, r1, r2): if r1 in request.GET and r2 in request.GET: try: if obj.get_match(match).can_modify(): obj.get_match(match).modify(int(request.GET[r1]), int(request.GET[r2])) except: pass else: obj.get_match(match).modify(0, 0) for i in range(0, obj._nplayers): update(request, obj, i, 'm%i-1' % i, 'm%i-2' % i) obj.compute() ResObj = namedtuple('ResObj', 'scl scw proba probb') base['results'] = [] base['prob_draw'] = 0.0 for score in range(0,obj._nplayers+1): if 2*score < obj._nplayers: base['results'].append(ResObj(score, obj._nplayers-score, obj.get_tally()[1][score], obj.get_tally()[0][score])) elif 2*score == obj._nplayers: base['prob_draw'] = obj.get_tally()[0][score] if 2*score >= obj._nplayers: break base['t1'] = sum([r.proba for r in base['results']]) base['t2'] = sum([r.probb for r in base['results']]) MatchObj = namedtuple('MatchObj', 'obj pla plb modded canmod fixed sca scb') matches = [] base['s1'], base['s2'] = 0, 0 for i in range(0, obj._nplayers): match = obj.get_match(i) matches.append(MatchObj(match, match.get_player(0).dbpl, match.get_player(1).dbpl,\ match.is_modified(), match.can_modify(), match.is_fixed(),\ match._result[0], match._result[1])) if match.is_fixed(): base['s1'] += 1 if match._result[0] > match._result[1] else 0 base['s2'] += 1 if match._result[1] > match._result[0] else 0 base['matches'] = matches base['ps'] = request.GET['ps'] base['bo'] = request.GET['bo'] proleague_postable(base, obj, base['results'], base['prob_draw'], url='http://aligulac.com/predict/proleague/?bo=%s&ps=%s' % (base['bo'], base['ps'])) return render_to_response('pred_proleague.html', base)
def pred_match(request): base = base_ctx("Predict", request=request) dbpl = [get_object_or_404(Player, id=int(i)) for i in request.GET["ps"].split(",")] sipl = [make_player(pl) for pl in dbpl] num = (int(request.GET["bo"]) + 1) / 2 obj = match.Match(num) obj.set_players(sipl) s1, s2 = 0, 0 if "s1" in request.GET: try: s1 = max(min(int(request.GET["s1"]), num), 0) except: pass if "s2" in request.GET: try: s2 = max(min(int(request.GET["s2"]), num), 0) except: pass obj.modify(s1, s2) obj.compute() base.update( { "p1": dbpl[0], "p2": dbpl[1], "r1": sipl[0].elo + sipl[0].elo_race[sipl[1].race], "r2": sipl[1].elo + sipl[1].elo_race[sipl[0].race], } ) tally = obj.get_tally() base.update({"t1": tally[sipl[0]][1], "t2": tally[sipl[1]][1]}) base["max"] = max(base["t1"], base["t2"]) base["fav"] = dbpl[0] if base["t1"] > base["t2"] else dbpl[1] r1, r2 = [], [] for oc in obj._outcomes: if oc[1] > oc[2]: r1.append((oc[1], oc[2], oc[0])) else: r2.append((oc[1], oc[2], oc[0])) while len(r1) < len(r2): r1 = [None] + r1 while len(r2) < len(r1): r2 = [None] + r2 base["res"] = zip(r1, r2) base["ps"] = request.GET["ps"] base["bo"] = request.GET["bo"] base["s1"] = s1 base["s2"] = s2 match_postable(base, obj, r1, r2, url="http://aligulac.com/predict/match/?bo=%s&ps=%s" % (base["bo"], base["ps"])) return render_to_response("pred_match.html", base)
def proleague(request): base = base_ctx('Inference', 'Predict', request=request) # {{{ Get data, set up and simulate form = SetupForm(request.GET) if not form.is_valid(): return redirect('/inference/') num = form.cleaned_data['bo'][0] dbpl = form.cleaned_data['ps'] sipl = [make_player(p) for p in dbpl] nplayers = len(sipl) sim = TeamPL(num) sim.set_players(sipl) matchlist = [str(i) for i in range(0, nplayers//2)] update_matches(sim, matchlist, request) sim.compute() # }}} # {{{ Post-processing results, prob_draw = [], 0 for si in range(0, nplayers//4 + 1): if si == nplayers//4 and nplayers//2 % 2 == 0: prob_draw = sim.get_tally()[0][si] else: results.append({ 'scl': si, 'scw': sim._numw, 'proba': sim.get_tally()[1][si], 'probb': sim.get_tally()[0][si], }) rounds = [('Matches', matchlist)] matches = [sim.get_match(m) for m in matchlist] base.update({ 's1': sum([1 if m._result[0] > m._result[1] and m.is_fixed() else 0 for m in matches]), 's2': sum([1 if m._result[0] < m._result[1] and m.is_fixed() else 0 for m in matches]), 'results': results, 'prob_draw': prob_draw, 'ta': sum([r['proba'] for r in results]), 'tb': sum([r['probb'] for r in results]), 'matches': create_matches(sim, rounds), 'meanres': create_median_matches(sim, rounds), 'form': form, }) # }}} postable_proleague(base, request) base.update({"title": "Proleague team match"}) return render_to_response('pred_proleague.html', base)
def rrgroup(request): base = base_ctx('Inference', 'Predict', request=request) # {{{ Get data, set up and simulate form = SetupForm(request.GET) if not form.is_valid(): return redirect('/inference/') num = form.cleaned_data['bo'][0] dbpl = form.cleaned_data['ps'] sipl = [make_player(p) for p in dbpl] nplayers = len(sipl) nmatches = (nplayers-1) * nplayers // 2 group = RRGroup(nplayers, num, ['mscore', 'sscore', 'imscore', 'isscore', 'ireplay'], 1) group.set_players(sipl) group.compute() # Necessary to fill the tiebreak tables. group.save_tally() matchlist = [str(i) for i in range(0, nmatches)] update_matches(group, matchlist, request) group.compute() # }}} #{{{ Post-processing players = list(sipl) for p in players: p.tally = group.get_tally()[p][::-1] for i in range(len(players[0].tally)-1, -1, -1): players.sort(key=lambda p: p.tally[i], reverse=True) rounds = [('Matches', matchlist)] base.update({ 'players': players, 'matches': create_matches(group, rounds), 'form': form, }) base['meanres'] = create_median_matches(group, rounds, modify=True) group.compute() for p in sipl: p.mtally = group.get_tally()[p] base['mplayers'] = group.table # }}} postable_rrgroup(base, request) base.update({"title": "Round robin group"}) return render_to_response('pred_rrgroup.html', base)
def sebracket(request): base = base_ctx('Inference', 'Predict', request=request) # {{{ Get data, set up and simulate form = SetupForm(request.GET) if not form.is_valid(): return redirect('/inference/') num = form.cleaned_data['bo'] dbpl = form.cleaned_data['ps'] sipl = [make_player(p) for p in dbpl] nrounds = int(log(len(sipl), 2)) num = [num[0]] * (nrounds - len(num)) + num if len(num) > nrounds: num = num[-nrounds:] bracket = SEBracket(num) bracket.set_players(sipl) matchlist = ['%i-%i' % (rnd, j) for rnd in range(1, nrounds+1) for j in range(1, 2**(nrounds-rnd)+1)] update_matches(bracket, matchlist, request) bracket.compute() # }}} # {{{ Post-processing players = list(sipl) for p in players: p.tally = bracket.get_tally()[p][::-1] for i in range(len(players[0].tally)-1, -1, -1): players.sort(key=lambda p: p.tally[i], reverse=True) rounds = [ ('Round %i' % rnd, ['%i-%i' % (rnd, j) for j in range(1, 2**(nrounds-rnd)+1)]) for rnd in range(1, nrounds+1) ] base.update({ 'players': players, 'matches': create_matches(bracket, rounds), 'meanres': create_median_matches(bracket, rounds), 'nrounds': nrounds, 'form': form, }) # }}} postable_sebracket(base, request, group_by(base['meanres'], key=lambda a: a['eventtext'])) base.update({"title": "Single elimination bracket"}) return render_to_response('pred_sebracket.html', base)
def pred_match(request): base = base_ctx('Predict', request=request) dbpl = [get_object_or_404(Player, id=int(i)) for i in request.GET['ps'].split(',')] sipl = [make_player(pl) for pl in dbpl] num = (int(request.GET['bo'])+1)/2 obj = match.Match(num) obj.set_players(sipl) s1, s2 = 0, 0 if 's1' in request.GET: try: s1 = max(min(int(request.GET['s1']), num), 0) except: pass if 's2' in request.GET: try: s2 = max(min(int(request.GET['s2']), num), 0) except: pass obj.modify(s1, s2) obj.compute() base.update({'p1': dbpl[0], 'p2': dbpl[1], 'r1': sipl[0].elo + sipl[0].elo_race[sipl[1].race],\ 'r2': sipl[1].elo + sipl[1].elo_race[sipl[0].race]}) tally = obj.get_tally() base.update({'t1': tally[sipl[0]][1], 't2': tally[sipl[1]][1]}) base['max'] = max(base['t1'], base['t2']) base['fav'] = dbpl[0] if base['t1'] > base['t2'] else dbpl[1] r1, r2 = [], [] for oc in obj._outcomes: if oc[1] > oc[2]: r1.append((oc[1], oc[2], oc[0])) else: r2.append((oc[1], oc[2], oc[0])) while len(r1) < len(r2): r1 = [None] + r1 while len(r2) < len(r1): r2 = [None] + r2 base['res'] = zip(r1, r2) base['ps'] = request.GET['ps'] base['bo'] = request.GET['bo'] base['s1'] = s1 base['s2'] = s2 match_postable(base, obj, r1, r2) return render_to_response('pred_match.html', base)
def __init__(self, dbpl=None, bos=None, args=None): if dbpl is None: return self.dbpl = dbpl self.bos = bos num = bos[0] nplayers = len(dbpl) nmatches = nplayers // 2 sipl = [make_player(p) for p in dbpl] obj = TeamPL(num) obj.set_players(sipl) prefixes = [str(i) for i in range(0, nmatches)] self.update_matches(obj, prefixes, args) obj.compute() self.matches = self.create_matches(obj, [(_('Matches'), prefixes)]) self.outcomes = [] self.prob_draw = 0 for si in range(0, nmatches // 2 + 1): if si == nmatches // 2 and nmatches % 2 == 0: self.prob_draw = obj.get_tally()[0][si] else: self.outcomes.append({ 'loser': si, 'winner': obj._numw, 'proba': obj.get_tally()[1][si], 'probb': obj.get_tally()[0][si], }) matches = [obj.get_match(m) for m in prefixes] self.s1 = sum([ 1 if m._result[0] > m._result[1] and m.is_fixed() else 0 for m in matches ]) self.s2 = sum([ 1 if m._result[0] < m._result[1] and m.is_fixed() else 0 for m in matches ]) self.proba = sum(r['proba'] for r in self.outcomes) self.probb = sum(r['probb'] for r in self.outcomes) self.meanres = self.create_median_matches(obj, [(_('Matches'), prefixes)])
def __init__(self, dbpl=None, bos=None, args=None): if dbpl is None: return nplayers = len(dbpl) nmatches = (nplayers - 1) * nplayers // 2 num = bos[0] prefixes = [str(i) for i in range(0, nmatches)] self.dbpl = dbpl self.bos = bos sipl = [make_player(p) for p in dbpl] obj = RRGroup(nplayers, num, ['mscore', 'sscore', 'imscore', 'isscore', 'ireplay'], 1) obj.set_players(sipl) obj.compute() # Necessary to fill the tiebreak tables. obj.save_tally() self.update_matches(obj, prefixes, args) obj.compute() players = list(sipl) for p in players: p.tally = obj.get_tally()[p][::-1] for i in range(len(players[0].tally) - 1, -1, -1): players.sort(key=lambda p: p.tally[i], reverse=True) self.table = [{ 'player': self.player_data(p.dbpl), 'probs': p.tally } for p in players] self.matches = self.create_matches(obj, [(_('Group play'), prefixes)]) self.meanres = self.create_median_matches( obj, [(_('Group play'), prefixes)]) obj.compute() mplayers = list(sipl) for p in mplayers: p.mtally = obj.get_tally()[p] self.mtable = [{ 'player': self.player_data(p.dbpl), 'exp_match_wins': p.mtally.exp_mscore()[0], 'exp_match_losses': p.mtally.exp_mscore()[1], 'exp_set_wins': p.mtally.exp_sscore()[0], 'exp_set_losses': p.mtally.exp_sscore()[1], } for p in obj.table]
def __init__(self, dbpl=None, bos=None, args=None): if dbpl is None: return nplayers = len(dbpl) nmatches = (nplayers-1) * nplayers // 2 num = bos[0] prefixes = [str(i) for i in range(0, nmatches)] self.dbpl = dbpl self.bos = bos sipl = [make_player(p) for p in dbpl] obj = RRGroup(nplayers, num, ['mscore', 'sscore', 'imscore', 'isscore', 'ireplay'], 1) obj.set_players(sipl) obj.compute() # Necessary to fill the tiebreak tables. obj.save_tally() self.update_matches(obj, prefixes, args) obj.compute() players = list(sipl) for p in players: p.tally = obj.get_tally()[p][::-1] for i in range(len(players[0].tally)-1, -1, -1): players.sort(key=lambda p: p.tally[i], reverse=True) self.table = [ {'player': self.player_data(p.dbpl), 'probs': p.tally} for p in players ] self.matches = self.create_matches(obj, [(_('Group play'), prefixes)]) self.meanres = self.create_median_matches(obj, [(_('Group play'), prefixes)]) obj.compute() mplayers = list(sipl) for p in mplayers: p.mtally = obj.get_tally()[p] self.mtable = [{ 'player': self.player_data(p.dbpl), 'exp_match_wins': p.mtally.exp_mscore()[0], 'exp_match_losses': p.mtally.exp_mscore()[1], 'exp_set_wins': p.mtally.exp_sscore()[0], 'exp_set_losses': p.mtally.exp_sscore()[1], } for p in obj.table]
def dual(request): base = base_ctx('Inference', 'Predict', request=request) # {{{ Get data, set up and simulate form = SetupForm(request.GET) if not form.is_valid(): return redirect('/inference/') num = form.cleaned_data['bo'][0] dbpl = form.cleaned_data['ps'] sipl = [make_player(p) for p in dbpl] group = MSLGroup(num) group.set_players(sipl) update_matches(group, '12wlf', request) group.compute() # }}} # {{{ Post-processing players = list(sipl) for p in players: p.tally = group.get_tally()[p] for i in range(0, 4): players.sort(key=lambda p: p.tally[i], reverse=True) rounds = [ ('Intial round', '12'), ('Winners\' and losers\' matches', 'wl'), ('Final match', 'f'), ] base.update({ 'players': players, 'matches': create_matches(group, rounds), 'meanres': create_median_matches(group, rounds), 'form': form, }) # }}} postable_dual(base, request) base.update({"title": "Dual tournament"}) return render_to_response('pred_4pswiss.html', base)
def __init__(self, dbpl=None, bos=None, args=None): if dbpl is None: return self.dbpl = dbpl self.bos = bos num = bos[0] nplayers = len(dbpl) nmatches = nplayers//2 sipl = [make_player(p) for p in dbpl] obj = TeamPL(num) obj.set_players(sipl) prefixes = [str(i) for i in range(0, nmatches)] self.update_matches(obj, prefixes, args) obj.compute() self.matches = self.create_matches(obj, [(_('Matches'), prefixes)]) self.outcomes = [] self.prob_draw = 0 for si in range(0, nmatches//2 + 1): if si == nmatches//2 and nmatches % 2 == 0: self.prob_draw = obj.get_tally()[0][si] else: self.outcomes.append({ 'loser': si, 'winner': obj._numw, 'proba': obj.get_tally()[1][si], 'probb': obj.get_tally()[0][si], }) matches = [obj.get_match(m) for m in prefixes] self.s1 = sum([1 if m._result[0] > m._result[1] and m.is_fixed() else 0 for m in matches]) self.s2 = sum([1 if m._result[0] < m._result[1] and m.is_fixed() else 0 for m in matches]) self.proba = sum(r['proba'] for r in self.outcomes) self.probb = sum(r['probb'] for r in self.outcomes) self.meanres = self.create_median_matches(obj, [(_('Matches'), prefixes)])
def __init__(self, dbpl=None, bos=None, args=None): if dbpl is None: return nrounds = int(log(len(dbpl), 2)) num = [bos[0]] * (nrounds - len(bos)) + bos if len(num) > nrounds: num = num[-nrounds:] prefixes = [ '%i-%i' % (rnd, j) for rnd in range(1, nrounds + 1) for j in range(1, 2**(nrounds - rnd) + 1) ] rounds = [ (_('Round %i') % rnd, ['%i-%i' % (rnd, j) for j in range(1, 2**(nrounds - rnd) + 1)]) for rnd in range(1, nrounds + 1) ] self.dbpl = dbpl self.bos = bos sipl = [make_player(p) for p in dbpl] obj = SEBracket(num) obj.set_players(sipl) self.update_matches(obj, prefixes, args) obj.compute() players = list(sipl) for p in players: p.tally = obj.get_tally()[p][::-1] for i in range(len(players[0].tally) - 1, -1, -1): players.sort(key=lambda p: p.tally[i], reverse=True) self.table = [{ 'player': self.player_data(p.dbpl), 'probs': p.tally } for p in players] self.matches = self.create_matches(obj, rounds) self.meanres = self.create_median_matches(obj, rounds) self.nrounds = nrounds
def __init__(self, dbpl=None, bos=None, args=None): if dbpl is None: return nrounds = int(log(len(dbpl), 2)) num = [bos[0]] * (nrounds - len(bos)) + bos if len(num) > nrounds: num = num[-nrounds:] prefixes = ['%i-%i' % (rnd, j) for rnd in range(1, nrounds+1) for j in range(1, 2**(nrounds-rnd)+1)] rounds = [ (_('Round %i') % rnd, ['%i-%i' % (rnd, j) for j in range(1, 2**(nrounds-rnd)+1)]) for rnd in range(1, nrounds+1) ] self.dbpl = dbpl self.bos = bos sipl = [make_player(p) for p in dbpl] obj = SEBracket(num) obj.set_players(sipl) self.update_matches(obj, prefixes, args) obj.compute() players = list(sipl) for p in players: p.tally = obj.get_tally()[p][::-1] for i in range(len(players[0].tally)-1, -1, -1): players.sort(key=lambda p: p.tally[i], reverse=True) self.table = [ {'player': self.player_data(p.dbpl), 'probs': p.tally} for p in players ] self.matches = self.create_matches(obj, rounds) self.meanres = self.create_median_matches(obj, rounds) self.nrounds = nrounds
ratings = list(filter_active(Rating.objects.filter( period=curp, player__groupmembership__group=t, player__groupmembership__current=True, player__groupmembership__playing=True, )).order_by('-rating').select_related('player')[:nplayers_max]) if proleague: players.append(ratings[::-1]) else: ace = ratings[0] shuffle(ratings) players.append(ratings + [ace]) if proleague: sipl = [make_player(r.player) for r in players[0]] + [make_player(r.player) for r in players[1]] else: sipl = [[make_player(r.player) for r in ratings] for ratings in players] sim = Simulator(2) sim.set_players(sipl) sim.compute() if proleague: scores[ta] += sim._tally[0].win/(nteams-1) scores[tb] += sim._tally[1].win/(nteams-1) else: scores[ta] += sim._tally[0][1]/(nteams-1) scores[tb] += sim._tally[1][1]/(nteams-1) # }}}
def pred_match(request): base = base_ctx('Predict', 'Predict', request=request) base['short_url_button'] = True dbpl = [get_object_or_404(Player, id=int(i)) for i in request.GET['ps'].split(',')] sipl = [make_player(pl) for pl in dbpl] num = (int(request.GET['bo'])+1)/2 obj = match.Match(num) obj.set_players(sipl) s1, s2 = 0, 0 if 's1' in request.GET: try: s1 = max(min(int(request.GET['s1']), num), 0) except: pass if 's2' in request.GET: try: s2 = max(min(int(request.GET['s2']), num), 0) except: pass obj.modify(s1, s2) obj.compute() base.update({'p1': dbpl[0], 'p2': dbpl[1], 'r1': sipl[0].elo_vs_opponent(sipl[1]), 'r2': sipl[1].elo_vs_opponent(sipl[0])}) tally = obj.get_tally() base.update({'t1': tally[sipl[0]][1], 't2': tally[sipl[1]][1]}) base['max'] = max(base['t1'], base['t2']) base['fav'] = dbpl[0] if base['t1'] > base['t2'] else dbpl[1] r1, r2 = [], [] for oc in obj._outcomes: if oc[1] > oc[2]: r1.append((oc[1], oc[2], oc[0])) else: r2.append((oc[1], oc[2], oc[0])) while len(r1) < len(r2): r1 = [None] + r1 while len(r2) < len(r1): r2 = [None] + r2 base['res'] = zip(r1, r2) # Winrates base['w1'] = {} base['w2'] = {} def ntz(n): return n if n is not None else 0 matches_a = Match.objects.filter(pla=dbpl[0]) matches_b = Match.objects.filter(plb=dbpl[0]) a = matches_a.aggregate(Sum('sca'), Sum('scb')) b = matches_b.aggregate(Sum('sca'), Sum('scb')) base['w1']['total'] = (ntz(a['sca__sum']) + ntz(b['scb__sum']), ntz(a['scb__sum']) + ntz(b['sca__sum'])) a = matches_a.filter(rcb='P').aggregate(Sum('sca'), Sum('scb')) b = matches_b.filter(rca='P').aggregate(Sum('sca'), Sum('scb')) base['w1']['vp'] = (ntz(a['sca__sum']) + ntz(b['scb__sum']), ntz(a['scb__sum']) + ntz(b['sca__sum'])) a = matches_a.filter(rcb='T').aggregate(Sum('sca'), Sum('scb')) b = matches_b.filter(rca='T').aggregate(Sum('sca'), Sum('scb')) base['w1']['vt'] = (ntz(a['sca__sum']) + ntz(b['scb__sum']), ntz(a['scb__sum']) + ntz(b['sca__sum'])) a = matches_a.filter(rcb='Z').aggregate(Sum('sca'), Sum('scb')) b = matches_b.filter(rca='Z').aggregate(Sum('sca'), Sum('scb')) base['w1']['vz'] = (ntz(a['sca__sum']) + ntz(b['scb__sum']), ntz(a['scb__sum']) + ntz(b['sca__sum'])) base['w1']['max'] = int(round(100 * max( (float(base['w1']['vp'][0]) / float(sum(base['w1']['vp'])) if (sum(base['w1']['vp']) > 0) else 0), (float(base['w1']['vt'][0]) / float(sum(base['w1']['vt'])) if (sum(base['w1']['vt']) > 0) else 0), (float(base['w1']['vz'][0]) / float(sum(base['w1']['vz'])) if (sum(base['w1']['vz']) > 0) else 0) ))) base['w1']['min'] = int(round(100 * min( (float(base['w1']['vp'][0]) / float(sum(base['w1']['vp'])) if (sum(base['w1']['vp']) > 0) else 0), (float(base['w1']['vt'][0]) / float(sum(base['w1']['vt'])) if (sum(base['w1']['vt']) > 0) else 0), (float(base['w1']['vz'][0]) / float(sum(base['w1']['vz'])) if (sum(base['w1']['vz']) > 0) else 0) ))) a = matches_a.filter(plb=dbpl[1]).aggregate(Sum('sca'), Sum('scb')) b = matches_b.filter(pla=dbpl[1]).aggregate(Sum('sca'), Sum('scb')) base['w1']['vo'] = (ntz(a['sca__sum']) + ntz(b['scb__sum']), ntz(a['scb__sum']) + ntz(b['sca__sum'])) matches_a = Match.objects.filter(pla=dbpl[1]) matches_b = Match.objects.filter(plb=dbpl[1]) a = matches_a.aggregate(Sum('sca'), Sum('scb')) b = matches_b.aggregate(Sum('sca'), Sum('scb')) base['w2']['total'] = (ntz(a['sca__sum']) + ntz(b['scb__sum']), ntz(a['scb__sum']) + ntz(b['sca__sum'])) a = matches_a.filter(rcb='P').aggregate(Sum('sca'), Sum('scb')) b = matches_b.filter(rca='P').aggregate(Sum('sca'), Sum('scb')) base['w2']['vp'] = (ntz(a['sca__sum']) + ntz(b['scb__sum']), ntz(a['scb__sum']) + ntz(b['sca__sum'])) a = matches_a.filter(rcb='T').aggregate(Sum('sca'), Sum('scb')) b = matches_b.filter(rca='T').aggregate(Sum('sca'), Sum('scb')) base['w2']['vt'] = (ntz(a['sca__sum']) + ntz(b['scb__sum']), ntz(a['scb__sum']) + ntz(b['sca__sum'])) a = matches_a.filter(rcb='Z').aggregate(Sum('sca'), Sum('scb')) b = matches_b.filter(rca='Z').aggregate(Sum('sca'), Sum('scb')) base['w2']['vz'] = (ntz(a['sca__sum']) + ntz(b['scb__sum']), ntz(a['scb__sum']) + ntz(b['sca__sum'])) a = matches_a.filter(plb=dbpl[0]).aggregate(Sum('sca'), Sum('scb')) b = matches_b.filter(pla=dbpl[0]).aggregate(Sum('sca'), Sum('scb')) base['w2']['vo'] = (ntz(a['sca__sum']) + ntz(b['scb__sum']), ntz(a['scb__sum']) + ntz(b['sca__sum'])) base['w2']['max'] = int(round(100 * max( (float(base['w2']['vp'][0]) / float(sum(base['w2']['vp'])) if (sum(base['w2']['vp']) > 0) else 0), (float(base['w2']['vt'][0]) / float(sum(base['w2']['vt'])) if (sum(base['w2']['vt']) > 0) else 0), (float(base['w2']['vz'][0]) / float(sum(base['w2']['vz'])) if (sum(base['w2']['vz']) > 0) else 0) ))) base['w2']['min'] = int(round(100 * min( (float(base['w2']['vp'][0]) / float(sum(base['w2']['vp'])) if (sum(base['w2']['vp']) > 0) else 0), (float(base['w2']['vt'][0]) / float(sum(base['w2']['vt'])) if (sum(base['w2']['vt']) > 0) else 0), (float(base['w2']['vz'][0]) / float(sum(base['w2']['vz'])) if (sum(base['w2']['vz']) > 0) else 0) ))) base['ps'] = request.GET['ps'] base['bo'] = request.GET['bo'] base['s1'] = s1 base['s2'] = s2 match_postable(base, obj, r1, r2, url='http://aligulac.com/predict/match/?bo=%s&ps=%s' % (base['bo'], base['ps'])) return render_to_response('pred_match.html', base)
def pred_rrgroup(request): base = base_ctx('Predict', request=request) dbpl = [get_object_or_404(Player, id=int(i)) for i in request.GET['ps'].split(',')] sipl = [make_player(pl) for pl in dbpl] num = (int(request.GET['bo'])+1)/2 nplayers = len(sipl) obj = rrgroup.RRGroup(len(sipl), num, ['mscore', 'sscore', 'imscore', 'isscore', 'ireplay'], 1) obj.set_players(sipl) MeanRes = namedtuple('MeanRes', 'pla plb sca scb') meanres = [] for i in range(0, (nplayers-1)*nplayers/2): match = obj.get_match(i) match.compute() lsup = match.find_lsup() meanres.append(MeanRes(match.get_player(0).dbpl, match.get_player(1).dbpl, lsup[1], lsup[2])) match.modify(lsup[1], lsup[2]) base['meanres'] = meanres obj.compute() mtally = obj.get_tally() for p in sipl: p.mtally = mtally[p] base['mplayers'] = obj.table def update(request, obj, match, r1, r2): if r1 in request.GET and r2 in request.GET: try: if obj.get_match(match).can_modify(): obj.get_match(match).modify(int(request.GET[r1]), int(request.GET[r2])) except: pass else: obj.get_match(match).modify(0, 0) for i in range(0, (nplayers-1)*nplayers/2): update(request, obj, i, 'm%i-1' % i, 'm%i-2' % i) obj.compute() tally = obj.get_tally() players = list(sipl) for p in players: p.tally = tally[p][::-1] for i in range(len(players[0].tally)-1, -1, -1): players.sort(key=lambda p: p.tally[i], reverse=True) base['players'] = players MatchObj = namedtuple('MatchObj', 'obj pla plb modded canmod fixed sca scb') matches = [] for i in range(0, (nplayers-1)*nplayers/2): match = obj.get_match(i) matches.append(MatchObj(match, match.get_player(0).dbpl, match.get_player(1).dbpl,\ match.is_modified(), match.can_modify(), match.is_fixed(),\ match._result[0], match._result[1])) base['matches'] = matches base['ps'] = request.GET['ps'] base['bo'] = request.GET['bo'] rrgroup_postable(base, obj, players) return render_to_response('pred_rrgroup.html', base)
player__groupmembership__current=True, player__groupmembership__playing=True)\ .exclude(player__race='S').exclude(player__race='R') ratings = list(filter_active_ratings(ratings).order_by('-rating')[:nplayers_max]) if not proleague: # First six in random order, then strongest player for ace match ace = ratings[0] shuffle(ratings) players.append(ratings + [ace]) else: # Five players in order from weakest to strongest players.append(ratings[::-1]) # Convert to player objects for the simul library if proleague: sim_players = [make_player(r.player) for r in players[0]] +\ [make_player(r.player) for r in players[1]] else: sim_players = [[make_player(r.player) for r in ratings] for ratings in players] # Simulate the match obj = Simulator(2) obj.set_players(sim_players) obj.compute() # Add the scores if proleague: scores[team_a] += obj._tally[0].win/(nteams-1) scores[team_b] += obj._tally[1].win/(nteams-1) else: scores[team_a] += obj._tally[0][1]/(nteams-1)
def pred_sebracket(request): base = base_ctx('Predict', request=request) dbpl = [get_object_or_404(Player, id=int(i)) for i in request.GET['ps'].split(',')] sipl = [make_player(pl) for pl in dbpl] nrounds = int(log(len(sipl),2)) num = [(int(bo)+1)/2 for bo in request.GET['bo'].split(',')] if len(num) == 1: num = num * nrounds obj = sebracket.SEBracket(num) obj.set_players(sipl) def update(request, obj, match, r1, r2): if r1 in request.GET and r2 in request.GET: try: if obj.get_match(match).can_modify(): obj.get_match(match).modify(int(request.GET[r1]), int(request.GET[r2])) except: pass for rnd in range(1, nrounds+1): for j in range(1, 2**(nrounds-rnd)+1): s = '%i-%i' % (rnd, j) update(request, obj, s, 'm' + s + '-1', 'm' + s + '-2') obj.compute() tally = obj.get_tally() players = list(sipl) for p in players: p.tally = tally[p][::-1] for i in range(len(players[0].tally)-1, -1, -1): players.sort(key=lambda p: p.tally[i], reverse=True) base['players'] = players base['nrounds'] = nrounds MatchObj = namedtuple('MatchObj', 'obj pla plb modded canmod fixed sca scb id') matches = [] for rnd in range(1, nrounds+1): matches.append('Round %i' % rnd) for j in range(1, 2**(nrounds-rnd)+1): match = obj.get_match('%i-%i' % (rnd, j)) matches.append(MatchObj(match, match.get_player(0).dbpl, match.get_player(1).dbpl,\ match.is_modified(), match.can_modify(), match.is_fixed(),\ match._result[0], match._result[1], '%i-%i' % (rnd, j))) base['matches'] = matches MeanRes = namedtuple('MeanRes', 'pla plb sca scb') meanres = [] for rnd in range(1, nrounds+1): meanres.append('Round %i' % rnd) for j in range(1, 2**(nrounds-rnd)+1): match = obj.get_match('%i-%i' % (rnd, j)) match.compute() lsup = match.find_lsup() meanres.append(MeanRes(match.get_player(0).dbpl, match.get_player(1).dbpl, lsup[1], lsup[2])) match.broadcast_instance((0, [lsup[4], lsup[3]], match)) base['meanres'] = meanres base['ps'] = request.GET['ps'] base['bo'] = request.GET['bo'] sebracket_postable(base, obj, players) return render_to_response('pred_sebracket.html', base)
def match(request): base = base_ctx('Inference', 'Predict', request=request) # {{{ Get data, set up and simulate form = SetupForm(request.GET) if not form.is_valid(): return redirect('/inference/') num = form.cleaned_data['bo'][0] dbpl = form.cleaned_data['ps'] sipl = [make_player(p) for p in dbpl] match = MatchSim(num) match.set_players(sipl) match.modify( get_param_range(request, 's1', (0, num), 0), get_param_range(request, 's2', (0, num), 0), ) match.compute() # }}} # {{{ Postprocessing base.update({ 'form': form, 'dbpl': dbpl, 'rta': sipl[0].elo_vs_opponent(sipl[1]), 'rtb': sipl[1].elo_vs_opponent(sipl[0]), 'proba': match.get_tally()[sipl[0]][1], 'probb': match.get_tally()[sipl[1]][1], 'match': match, }) base.update({ 'max': max(base['proba'], base['probb']), 'fav': dbpl[0] if base['proba'] > base['probb'] else dbpl[1], }) resa, resb = [], [] outcomes = [ {'sca': outcome[1], 'scb': outcome[2], 'prob': outcome[0]} for outcome in match.instances_detail() ] resa = [oc for oc in outcomes if oc['sca'] > oc['scb']] resb = [oc for oc in outcomes if oc['scb'] > oc['sca']] if len(resa) < len(resb): resa = [None] * (len(resb) - len(resa)) + resa else: resb = [None] * (len(resa) - len(resb)) + resb base['res'] = list(zip(resa, resb)) # }}} # {{{ Scores and other data thr = date.today() - relativedelta(months=2) pla_matches = dbpl[0].get_matchset() plb_matches = dbpl[1].get_matchset() base['tot_w_a'], base['tot_l_a'] = count_winloss_player(pla_matches, dbpl[0]) base['frm_w_a'], base['frm_l_a'] = count_winloss_player(pla_matches.filter(date__gte=thr), dbpl[0]) base['tot_w_b'], base['tot_l_b'] = count_winloss_player(plb_matches, dbpl[1]) base['frm_w_b'], base['frm_l_b'] = count_winloss_player(plb_matches.filter(date__gte=thr), dbpl[1]) if dbpl[1].race in 'PTZ': base['mu_w_a'], base['mu_l_a'] = count_matchup_player(pla_matches, dbpl[0], dbpl[1].race) base['fmu_w_a'], base['fmu_l_a'] = count_matchup_player( pla_matches.filter(date__gte=thr), dbpl[0], dbpl[1].race ) if dbpl[0].race in 'PTZ': base['mu_w_b'], base['mu_l_b'] = count_matchup_player(plb_matches, dbpl[1], dbpl[0].race) base['fmu_w_b'], base['fmu_l_b'] = count_matchup_player( plb_matches.filter(date__gte=thr), dbpl[1], dbpl[0].race ) wa_a, wb_a = count_winloss_games(Match.objects.filter(pla=dbpl[0], plb=dbpl[1])) wb_b, wa_b = count_winloss_games(Match.objects.filter(pla=dbpl[1], plb=dbpl[0])) base['vs_a'] = wa_a + wa_b base['vs_b'] = wb_a + wb_b base['matches'] = display_matches( Match.objects.filter(Q(pla=dbpl[0], plb=dbpl[1]) | Q(plb=dbpl[0], pla=dbpl[1])) .select_related('period', 'pla', 'plb') .order_by('-date', 'id'), fix_left=dbpl[0], ) # }}} postable_match(base, request) base.update({"title": "{} vs. {}".format(dbpl[0].tag, dbpl[1].tag)}) return render_to_response('pred_match.html', base)
def pred_rrgroup(request): base = base_ctx("Predict", request=request) dbpl = [get_object_or_404(Player, id=int(i)) for i in request.GET["ps"].split(",")] sipl = [make_player(pl) for pl in dbpl] num = (int(request.GET["bo"]) + 1) / 2 nplayers = len(sipl) obj = rrgroup.RRGroup(len(sipl), num, ["mscore", "sscore", "imscore", "isscore", "ireplay"], 1) obj.set_players(sipl) MeanRes = namedtuple("MeanRes", "pla plb sca scb") meanres = [] for i in range(0, (nplayers - 1) * nplayers / 2): match = obj.get_match(i) match.compute() lsup = match.find_lsup() meanres.append(MeanRes(match.get_player(0).dbpl, match.get_player(1).dbpl, lsup[1], lsup[2])) match.modify(lsup[1], lsup[2]) base["meanres"] = meanres obj.compute() mtally = obj.get_tally() for p in sipl: p.mtally = mtally[p] base["mplayers"] = obj.table def update(request, obj, match, r1, r2): if r1 in request.GET and r2 in request.GET: try: if obj.get_match(match).can_modify(): obj.get_match(match).modify(int(request.GET[r1]), int(request.GET[r2])) except: pass else: obj.get_match(match).modify(0, 0) for i in range(0, (nplayers - 1) * nplayers / 2): update(request, obj, i, "m%i-1" % i, "m%i-2" % i) obj.compute() tally = obj.get_tally() players = list(sipl) for p in players: p.tally = tally[p][::-1] for i in range(len(players[0].tally) - 1, -1, -1): players.sort(key=lambda p: p.tally[i], reverse=True) base["players"] = players MatchObj = namedtuple("MatchObj", "obj pla plb modded canmod fixed sca scb") matches = [] for i in range(0, (nplayers - 1) * nplayers / 2): match = obj.get_match(i) matches.append( MatchObj( match, match.get_player(0).dbpl, match.get_player(1).dbpl, match.is_modified(), match.can_modify(), match.is_fixed(), match._result[0], match._result[1], ) ) base["matches"] = matches base["ps"] = request.GET["ps"] base["bo"] = request.GET["bo"] rrgroup_postable( base, obj, players, url="http://aligulac.com/predict/rrgroup/?bo=%s&ps=%s" % (base["bo"], base["ps"]) ) return render_to_response("pred_rrgroup.html", base)
def pred_sebracket(request): base = base_ctx("Predict", request=request) dbpl = [] for i in request.GET["ps"].split(","): id = int(i) if id > 0: dbpl.append(get_object_or_404(Player, id=id)) else: dbpl.append(None) sipl = [make_player(pl) for pl in dbpl] nrounds = int(log(len(sipl), 2)) num = [(int(bo) + 1) / 2 for bo in request.GET["bo"].split(",")] if len(num) == 1: num = num * nrounds obj = sebracket.SEBracket(num) obj.set_players(sipl) def update(request, obj, match, r1, r2): if r1 in request.GET and r2 in request.GET: try: if obj.get_match(match).can_modify(): obj.get_match(match).modify(int(request.GET[r1]), int(request.GET[r2])) except: pass for rnd in range(1, nrounds + 1): for j in range(1, 2 ** (nrounds - rnd) + 1): s = "%i-%i" % (rnd, j) update(request, obj, s, "m" + s + "-1", "m" + s + "-2") obj.compute() tally = obj.get_tally() players = list(sipl) for p in players: p.tally = tally[p][::-1] for i in range(len(players[0].tally) - 1, -1, -1): players.sort(key=lambda p: p.tally[i], reverse=True) base["players"] = [p for p in players if p.dbpl is not None] base["nrounds"] = nrounds MatchObj = namedtuple("MatchObj", "obj pla plb modded canmod fixed sca scb id") matches = [] for rnd in range(1, nrounds + 1): matches.append("Round %i" % rnd) for j in range(1, 2 ** (nrounds - rnd) + 1): match = obj.get_match("%i-%i" % (rnd, j)) if match.get_player(0).dbpl is not None and match.get_player(1).dbpl is not None: matches.append( MatchObj( match, match.get_player(0).dbpl, match.get_player(1).dbpl, match.is_modified(), match.can_modify(), match.is_fixed(), match._result[0], match._result[1], "%i-%i" % (rnd, j), ) ) base["matches"] = matches MeanRes = namedtuple("MeanRes", "pla plb sca scb") meanres = [] for rnd in range(1, nrounds + 1): meanres.append("Round %i" % rnd) for j in range(1, 2 ** (nrounds - rnd) + 1): match = obj.get_match("%i-%i" % (rnd, j)) match.compute() lsup = match.find_lsup() meanres.append(MeanRes(match.get_player(0).dbpl, match.get_player(1).dbpl, lsup[1], lsup[2])) match.broadcast_instance((0, [lsup[4], lsup[3]], match)) base["meanres"] = meanres base["ps"] = request.GET["ps"] base["bo"] = request.GET["bo"] sebracket_postable( base, obj, players, url="http://aligulac.com/predict/sebracket/?bo=%s&ps=%s" % (base["bo"], base["ps"]) ) return render_to_response("pred_sebracket.html", base)
def pred_4pswiss(request): base = base_ctx("Predict", request=request) dbpl = [get_object_or_404(Player, id=int(i)) for i in request.GET["ps"].split(",")] sipl = [make_player(pl) for pl in dbpl] num = (int(request.GET["bo"]) + 1) / 2 obj = mslgroup.MSLGroup(num) obj.set_players(sipl) def update(request, obj, match, r1, r2): if r1 in request.GET and r2 in request.GET: try: if obj.get_match(match).can_modify(): obj.get_match(match).modify(int(request.GET[r1]), int(request.GET[r2])) except: pass update(request, obj, "first", "11", "12") update(request, obj, "second", "21", "22") update(request, obj, "winners", "31", "32") update(request, obj, "losers", "41", "42") update(request, obj, "final", "51", "52") obj.compute() tally = obj.get_tally() players = list(sipl) for p in players: p.tally = tally[p] for i in range(0, 4): players.sort(key=lambda p: p.tally[i], reverse=True) base["players"] = players MatchObj = namedtuple("MatchObj", "obj pla plb modded canmod fixed sca scb") matches = [] for mname in ["first", "second", "winners", "losers", "final"]: match = obj.get_match(mname) matches.append( MatchObj( match, match.get_player(0).dbpl, match.get_player(1).dbpl, match.is_modified(), match.can_modify(), match.is_fixed(), match._result[0], match._result[1], ) ) base["matches"] = matches MeanRes = namedtuple("MeanRes", "pla plb sca scb") meanres = [] for mname in ["first", "second", "winners", "losers", "final"]: match = obj.get_match(mname) match.compute() lsup = match.find_lsup() meanres.append(MeanRes(match.get_player(0).dbpl, match.get_player(1).dbpl, lsup[1], lsup[2])) match.broadcast_instance((0, [lsup[4], lsup[3]], match)) base["meanres"] = meanres base["ps"] = request.GET["ps"] base["bo"] = request.GET["bo"] fpswiss_postable( base, obj, players, url="http://aligulac.com/predict/4pswiss/?bo=%s&ps=%s" % (base["bo"], base["ps"]) ) return render_to_response("pred_4pswiss.html", base)
for team in [team_a, team_b]: ratings = Rating.objects.filter(period=current_period, player__teammembership__team=team,\ player__teammembership__current=True, player__teammembership__playing=True)\ .exclude(player__race='S').exclude(player__race='R') ratings = list(filter_active_ratings(ratings).order_by('-rating')[:nplayers_max]) if proleague: # First six in random order, then strongest player for ace match ace = ratings[0] shuffle(ratings) players.append(ratings + [ace]) else: # Five players in order from weakest to strongest players.append(ratings[::-1]) # Convert to player objects for the simul library sim_players = [[make_player(r.player) for r in ratings] for ratings in players] # Simulate the match obj = Simulator(2) obj.set_players(sim_players) obj.compute() # Add the scores scores[team_a] += obj._tally[0][1]/(nteams-1) scores[team_b] += obj._tally[1][1]/(nteams-1) # Write the scores to database if proleague: teams.update(scorepl=0.0) else: teams.update(scoreak=0.0)