class Arpad::Calculator

Public Class Methods

calculate_elo(elo_one, elo_two, outcome, config = {}) click to toggle source
# File lib/arpad.rb, line 5
def self.calculate_elo(elo_one, elo_two, outcome, config = {})
  k_factor = config[:k_factor] || 16
  transformed_rating_one = calculate_transformed_rating(elo_one)
  transformed_rating_two = calculate_transformed_rating(elo_two)
  expected_score = calculate_expected_score(
    transformed_rating_one,
    transformed_rating_two
  )
  score_value = calculate_score_value(outcome)

  (elo_one.to_i + (k_factor * (score_value - expected_score))).to_i
end

Private Class Methods

calculate_expected_score(t_rating_one, t_rating_two) click to toggle source
# File lib/arpad.rb, line 24
def self.calculate_expected_score(t_rating_one, t_rating_two)
  t_rating_one / (t_rating_one + t_rating_two)
end
calculate_score_value(outcome) click to toggle source
# File lib/arpad.rb, line 28
def self.calculate_score_value(outcome)
  if outcome == "win"
    1
  elsif outcome == "lose"
    0
  elsif outcome == "tie"
    0.5
  else
    raise "user inputted #{outcome} which is not a valid outcome"
  end
end
calculate_transformed_rating(elo) click to toggle source
# File lib/arpad.rb, line 20
def self.calculate_transformed_rating(elo)
  (10**(elo.to_f / 400))
end