glicko2 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|