Beispiel #1
0
    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()
        ]
Beispiel #2
0
    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)
Beispiel #3
0
    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)
Beispiel #4
0
    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()]
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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)
Beispiel #11
0
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)
Beispiel #12
0
    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)])
Beispiel #13
0
    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]
Beispiel #14
0
    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)
Beispiel #16
0
    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)])
Beispiel #17
0
    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
Beispiel #18
0
    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
Beispiel #19
0
        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)
# }}}
Beispiel #20
0
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)
Beispiel #21
0
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)
Beispiel #22
0
                                        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)
Beispiel #23
0
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)
Beispiel #25
0
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)
Beispiel #26
0
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)
Beispiel #27
0
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)
Beispiel #28
0
        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)
# }}}
Beispiel #29
0
    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)