Example #1
0
void TrueSkill::adjust_players(std::vector<Player*> players) {
    Constants constants;

    std::sort(players.begin(), players.end(), player_sorter());

    std::vector<Variable*> ss, ps, ts, ds;
    unsigned int i = 0, size = players.size();
    double gammasqr = constants.GAMMA * constants.GAMMA,
           betasqr = constants.BETA * constants.BETA;

    for (i = 0; i < size; ++i) {
        ss.push_back(new Variable());
        ps.push_back(new Variable());
        ts.push_back(new Variable());
    }

    for (i = 0; i < size - 1; ++i) {
        ds.push_back(new Variable());
    }

    std::vector<PriorFactor*> skill;
    for (i = 0; i < size; ++i) {
        Player* pl = players[i];
        Variable* s = ss[i];
        Gaussian* gaussian = new Gaussian();
        gaussian->init_mu_sigma(pl->mu, sqrt((pl->sigma * pl->sigma) + gammasqr));
        skill.push_back(new PriorFactor(s, gaussian));
    }

    std::vector<LikelihoodFactor*> skill_to_perf;
    for (i = 0; i < size; ++i) {
        Variable* s = ss[i];
        Variable* p = ps[i];
        skill_to_perf.push_back(new LikelihoodFactor(s, p, betasqr));
    }

    std::vector<SumFactor*> perf_to_team;
    for (i = 0; i < size; ++i) {
        std::vector<Variable*>* p = new std::vector<Variable*>();
        std::vector<double>* c = new std::vector<double>;
        p->push_back(ps[i]);
        c->push_back(1.0);
        perf_to_team.push_back(new SumFactor(ts[i], p, c));
    }

    std::vector<SumFactor*> team_diff;
    for (i = 0; i < size - 1; ++i) {
        std::vector<Variable*>* p = new std::vector<Variable*>();
        p->push_back(ts[i]);
        p->push_back(ts[i + 1]);
        std::vector<double>* c = new std::vector<double>;
        c->push_back(1.0);
        c->push_back(-1.0);
        team_diff.push_back(new SumFactor(ds[i], p, c));
    }

    std::vector<TruncateFactor*> trunc;
    for (i = 0; i < size - 1; ++i) {
        TruncateFactor* tf;
        if (players[i]->rank == players[i + 1]->rank) {
            tf = new TruncateFactorDraw(ds[i], constants.EPSILON);
        } else {
            tf = new TruncateFactorWin(ds[i], constants.EPSILON);
        }
        trunc.push_back(tf);
    }

    for(std::vector<PriorFactor*>::iterator it = skill.begin(); it != skill.end(); ++it) {
        (*it)->start();
    }

    for(std::vector<LikelihoodFactor*>::iterator it = skill_to_perf.begin(); it != skill_to_perf.end(); ++it) {
        (*it)->update_value();
    }

    for(std::vector<SumFactor*>::iterator it = perf_to_team.begin(); it != perf_to_team.end(); ++it) {
        (*it)->update_sum();
    }

    for (i = 0; i < 5; ++i) {
        for(std::vector<SumFactor*>::iterator it = team_diff.begin(); it != team_diff.end(); ++it) {
            (*it)->update_sum();
        }

        for(std::vector<TruncateFactor*>::iterator it = trunc.begin(); it != trunc.end(); ++it) {
            (*it)->update();
        }

        for(std::vector<SumFactor*>::iterator it = team_diff.begin(); it != team_diff.end(); ++it) {
            (*it)->update_term(0);
            (*it)->update_term(1);
        }
    }

    for(std::vector<SumFactor*>::iterator it = perf_to_team.begin(); it != perf_to_team.end(); ++it) {
        (*it)->update_term(0);
    }

    for(std::vector<LikelihoodFactor*>::iterator it = skill_to_perf.begin(); it != skill_to_perf.end(); ++it) {
        (*it)->update_mean();
    }

    for (i = 0; i < size; ++i) {
        players[i]->mu = ss[i]->value->get_mu();
        players[i]->sigma = ss[i]->value->get_sigma();
    }

    while(!skill.empty()) {
        delete skill.back();
        skill.pop_back();
    }

    while(!skill_to_perf.empty()) {
        delete skill_to_perf.back();
        skill_to_perf.pop_back();
    }

    while(!perf_to_team.empty()) {
        delete perf_to_team.back();
        perf_to_team.pop_back();
    }

    while(!team_diff.empty()) {
        delete team_diff.back();
        team_diff.pop_back();
    }

    while(!trunc.empty()) {
        delete trunc.back();
        trunc.pop_back();
    }

    while(!ss.empty()) {
        delete ss.back();
        ss.pop_back();
    }

    while(!ts.empty()) {
        delete ts.back();
        ts.pop_back();
    }

    while(!ds.empty()) {
        delete ds.back();
        ds.pop_back();
    }

    while(!ps.empty()) {
        delete ps.back();
        ps.pop_back();
    }
}