def run_trueskill_openings():
    collection = DB.trueskill_openings
    player_collection = DB.trueskill_players
    player_collection.remove()
    player_collection.ensure_index('name')
    player_collection.ensure_index('mu')
    player_collection.ensure_index('floor')
    player_collection.ensure_index('ceil')
    collection.remove()
    collection.ensure_index('name')
    collection.ensure_index('mu')
    collection.ensure_index('floor')
    collection.ensure_index('ceil')
    for game in games.find():
        if len(game['decks']) >= 2 and len(game['decks'][1]['turns']) >= 5:
            teams = []
            results = []
            openings = []
            dups = False
            for deck in game['decks']:
                opening = deck['turns'][0].get('buys', []) +\
                          deck['turns'][1].get('buys', [])
                opening.sort()
                open_name = 'open:'+ ('+'.join(opening))
                if open_name in openings:
                    dups = True
                openings.append(open_name)
                nturns = len(deck['turns'])
                if deck['resigned']:
                    vp = -1000
                else:
                    vp = deck['points']
                results.append((-vp, nturns))
                player_name = deck['name']
                player_info = {
                    'name': player_name,
                    'mu': get_skill(player_name, player_collection),
                    'sigma': get_stdev(player_name, player_collection)
                }

                teams.append([open_name, player_info])
            ranks = results_to_ranks(results)
            if not dups:
                team_results = [
                    (team, [0.5, 0.5], rank)
                    for team, rank in zip(teams, ranks)
                ]
                db_update_trueskill(team_results, collection)
            player_results = [
                ([team[1]], [1.0], rank)
                for team, rank in zip(teams, ranks)
            ]
            db_update_trueskill(player_results, player_collection)
def run_trueskill_players():
    collection = DB.trueskill_players
    collection.remove()
    collection.ensure_index('name')
    for game in games.find():
        if len(game['decks']) >= 2:
            players = []
            results = []
            for deck in game['decks']:
                nturns = len(deck['turns'])
                if deck['resigned']:
                    vp = -1000
                else:
                    vp = deck['points']
                results.append((-vp, nturns))
                players.append(deck['name'])
            ranks = results_to_ranks(results)
            team_results = [
                ([player], [1.0], rank)
                for player, rank in zip(players, ranks)
            ]
            db_update_trueskill(team_results, collection)