Class: EloRankable::Calculator
- Inherits:
-
Object
- Object
- EloRankable::Calculator
- Defined in:
- lib/elo_rankable/calculator.rb
Class Method Summary collapse
-
.expected_score(rating_a, rating_b) ⇒ Object
Calculate expected score for player A against player B.
-
.update_ratings_for_draw(player1, player2) ⇒ Object
Update ratings after a draw.
-
.update_ratings_for_win(winner, loser) ⇒ Object
Update ratings after a match where player1 beats player2.
Class Method Details
.expected_score(rating_a, rating_b) ⇒ Object
Calculate expected score for player A against player B
7 8 9 |
# File 'lib/elo_rankable/calculator.rb', line 7 def expected_score(, ) 1.0 / (1.0 + (10.0**(( - ) / 400.0))) end |
.update_ratings_for_draw(player1, player2) ⇒ Object
Update ratings after a draw
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/elo_rankable/calculator.rb', line 35 def (player1, player2) = player1.elo_ranking = player2.elo_ranking # Defensive validation - these should be caught earlier but just in case raise ArgumentError, "Player1's elo_ranking is nil" if .nil? raise ArgumentError, "Player2's elo_ranking is nil" if .nil? player1_expected = expected_score(., .) player2_expected = expected_score(., .) player1_k = .k_factor player2_k = .k_factor # Both players get 0.5 points in a draw = . + (player1_k * (0.5 - player1_expected)) = . + (player2_k * (0.5 - player2_expected)) update_ranking(, ) update_ranking(, ) end |
.update_ratings_for_win(winner, loser) ⇒ Object
Update ratings after a match where player1 beats player2
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/elo_rankable/calculator.rb', line 12 def (winner, loser) = winner.elo_ranking = loser.elo_ranking # Defensive validation - these should be caught earlier but just in case raise ArgumentError, "Winner's elo_ranking is nil" if .nil? raise ArgumentError, "Loser's elo_ranking is nil" if .nil? winner_expected = expected_score(., .) loser_expected = expected_score(., .) winner_k = .k_factor loser_k = .k_factor # Winner gets 1 point, loser gets 0 points = . + (winner_k * (1 - winner_expected)) = . + (loser_k * (0 - loser_expected)) update_ranking(, ) update_ranking(, ) end |