class Skillz::Match

Public Class Methods

score(*teams) click to toggle source
# File lib/skillz/match.rb, line 4
def self.score(*teams)
  #set initial values
  teams.each{|t| t.uncertainty; t.skill_level}

  teams.each do |team1|
    omega = 0.0
    delta = 0.0
    teams.each do |team2|
      next if team1 == team2

      ciq = Math.sqrt(team1.uncertainty + team2.uncertainty + (2*Skillz::BETA*Skillz::BETA))
      piq = 1.0/(1+Math.exp((team2.skill_level-team1.skill_level)/ciq))
      sigsq_to_ciq = team1.uncertainty/ciq

      s = 0.0
      if team2.rank > team1.rank
        s = 1.0
      elsif team2.rank == team1.rank
        s = 0.5
      end

      omega += sigsq_to_ciq * (s-piq)
      gamma = Math.sqrt(team1.uncertainty)/ciq
      delta += gamma*sigsq_to_ciq/ciq*piq*(1-piq)
    end

    team1.players.map do |player|
      uncertainty_squared = player.skill_uncertainty**2
      player.skill_level += uncertainty_squared/team1.uncertainty * omega
      player.skill_uncertainty *= Math.sqrt([1 - uncertainty_squared / team1.uncertainty * delta, 0.0001].max)
      player
    end
  end
end