glicko2 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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: