glicko2 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,17 +1,13 @@
1
- require "glicko2/version"
2
- require "glicko2/player"
3
- require "glicko2/rating_period"
4
-
5
1
  module Glicko2
6
2
  DEFAULT_VOLATILITY = 0.06
7
3
  DEFAULT_GLICKO_RATING = 1500.0
8
4
  DEFAULT_GLICKO_RATING_DEVIATION = 350.0
5
+ GLICKO_GRADIENT = 173.7178
9
6
 
10
- VOLATILITY_CHANGE = 0.5
7
+ DEFAULT_CONFIG = {:volatility_change => 0.5}.freeze
11
8
 
12
9
  # Collection of helper methods
13
10
  class Util
14
- GLICKO_GRADIENT = 173.7178
15
11
  GLICKO_INTERCEPT = DEFAULT_GLICKO_RATING
16
12
 
17
13
  # Convert from the original Glicko scale to Glicko2 scale
@@ -49,3 +45,7 @@ module Glicko2
49
45
  end
50
46
  end
51
47
  end
48
+
49
+ require "glicko2/version"
50
+ require "glicko2/player"
51
+ require "glicko2/rating_period"
@@ -24,6 +24,7 @@ module Glicko2
24
24
  #
25
25
  class Player
26
26
  TOLERANCE = 0.0000001
27
+ MIN_SD = DEFAULT_GLICKO_RATING_DEVIATION / GLICKO_GRADIENT
27
28
 
28
29
  attr_reader :mean, :sd, :volatility, :obj
29
30
 
@@ -32,20 +33,21 @@ module Glicko2
32
33
  #
33
34
  # @param [#rating,#rating_deviation,#volatility] obj seed values object
34
35
  # @return [Player] constructed instance.
35
- def self.from_obj(obj)
36
+ def self.from_obj(obj, config=DEFAULT_CONFIG)
36
37
  mean, sd = Util.to_glicko2(obj.rating, obj.rating_deviation)
37
- new(mean, sd, obj.volatility, obj)
38
+ new(mean, sd, obj.volatility, obj, config)
38
39
  end
39
40
 
40
41
  # @param [Numeric] mean player mean
41
42
  # @param [Numeric] sd player standard deviation
42
43
  # @param [Numeric] volatility player volatility
43
44
  # @param [#rating,#rating_deviation,#volatility] obj seed values object
44
- def initialize(mean, sd, volatility, obj=nil)
45
+ def initialize(mean, sd, volatility, obj=nil, config=DEFAULT_CONFIG)
45
46
  @mean = mean
46
47
  @sd = sd
47
48
  @volatility = volatility
48
49
  @obj = obj
50
+ @config = config
49
51
  @e = {}
50
52
  end
51
53
 
@@ -111,8 +113,8 @@ module Glicko2
111
113
  b = Math.log(d - sd ** 2 - v)
112
114
  else
113
115
  k = 1
114
- k += 1 while f(a - k * VOLATILITY_CHANGE, d, v) < 0
115
- b = a - k * VOLATILITY_CHANGE
116
+ k += 1 while f(a - k * @config[:volatility_change], d, v) < 0
117
+ b = a - k * @config[:volatility_change]
116
118
  end
117
119
  fa = f(a, d, v)
118
120
  fb = f(b, d, v)
@@ -160,7 +162,7 @@ module Glicko2
160
162
  private
161
163
 
162
164
  def generate_next_without_games
163
- sd_pre = Math.sqrt(sd ** 2 + volatility ** 2)
165
+ sd_pre = [Math.sqrt(sd ** 2 + volatility ** 2), MIN_SD].min
164
166
  self.class.new(mean, sd_pre, volatility, obj)
165
167
  end
166
168
 
@@ -183,7 +185,7 @@ module Glicko2
183
185
  end
184
186
 
185
187
  def f_part2(x)
186
- (x - Math::log(volatility ** 2)) / VOLATILITY_CHANGE ** 2
188
+ (x - Math::log(volatility ** 2)) / @config[:volatility_change] ** 2
187
189
  end
188
190
  end
189
191
  end
@@ -17,8 +17,8 @@ module Glicko2
17
17
  #
18
18
  # @param [Array<#rating,#rating_deviation,#volatility>] objs seed value objects
19
19
  # @return [RatingPeriod]
20
- def self.from_objs(objs)
21
- new(objs.map { |obj| Player.from_obj(obj) })
20
+ def self.from_objs(objs, config=DEFAULT_CONFIG)
21
+ new(objs.map { |obj| Player.from_obj(obj, config) })
22
22
  end
23
23
 
24
24
  # Register a game with this rating period
@@ -1,3 +1,3 @@
1
1
  module Glicko2
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -93,6 +93,13 @@ describe Glicko2::Player do
93
93
  p.sd.must_be_close_to Math.sqrt(@player.sd ** 2 + @player.volatility ** 2)
94
94
  end
95
95
 
96
+ it "must not decay rating deviation above default" do
97
+ @player = Glicko2::Player.from_obj(Rating.new(1500, Glicko2::DEFAULT_GLICKO_RATING_DEVIATION, 0.06))
98
+ p = @player.generate_next([], [])
99
+ p.update_obj
100
+ p.obj.rating_deviation.must_equal Glicko2::DEFAULT_GLICKO_RATING_DEVIATION
101
+ end
102
+
96
103
  bench_performance_linear "default" do |n|
97
104
  @player.generate_next(@others * n, @scores * n)
98
105
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glicko2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-26 00:00:00.000000000 Z
12
+ date: 2013-01-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
@@ -77,4 +77,3 @@ test_files:
77
77
  - spec/player_spec.rb
78
78
  - spec/rating_period_spec.rb
79
79
  - spec/util_spec.rb
80
- has_rdoc: