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.
- data/lib/glicko2.rb +6 -6
- data/lib/glicko2/player.rb +9 -7
- data/lib/glicko2/rating_period.rb +2 -2
- data/lib/glicko2/version.rb +1 -1
- data/spec/player_spec.rb +7 -0
- metadata +2 -3
data/lib/glicko2.rb
CHANGED
@@ -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
|
-
|
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"
|
data/lib/glicko2/player.rb
CHANGED
@@ -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 *
|
115
|
-
b = a - k *
|
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)) /
|
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
|
data/lib/glicko2/version.rb
CHANGED
data/spec/player_spec.rb
CHANGED
@@ -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.
|
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:
|
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:
|