keys = players.keys.sort
size = keys.size
matrix =
- Matrix::Int[*
+ Matrix[*
((0...size).collect do |k|
p1 = keys[k]
p1_hash = players[p1]
row.delete_at(delete_index)
copied_cols << row
end
- new_matrix = Matrix::Int[*copied_cols]
+ new_matrix = Matrix[*copied_cols]
new_keys = @keys.clone
new_keys.delete_at(delete_index)
return WinLossMatrix.new(new_keys, new_matrix)
result = subsets.collect do |keys|
matrix =
- Matrix::Int[*
+ Matrix[*
((0...keys.size).collect do |k|
p1 = @keys.index(keys[k])
((0...keys.size).collect do |j|
# Main methods
#
-def _add_win_loss(winner, loser)
+# Half-life effect
+# After NHAFE_LIFE days value will get half.
+# 0.693 is constant, where exp(0.693) ~ 0.5
+NHALF_LIFE=60
+def half_life(days)
+ if days < 7
+ return 1.0
+ else
+ Math::exp(-0.693/NHALF_LIFE*(days-7))
+ end
+end
+
+def _add_win_loss(winner, loser, time)
+ how_long_days = (Time.now - time)/(3600*24)
$players[winner] ||= Hash.new { GSL::Vector[0,0] }
$players[loser] ||= Hash.new { GSL::Vector[0,0] }
- $players[winner][loser] += GSL::Vector[1,0]
- $players[loser][winner] += GSL::Vector[0,1]
+ $players[winner][loser] += GSL::Vector[1.0*half_life(how_long_days),0]
+ $players[loser][winner] += GSL::Vector[0,1.0*half_life(how_long_days)]
end
def _add_time(player, time)
def add(black_mark, black_name, white_name, white_mark, time)
if black_mark == WIN_MARK && white_mark == LOSS_MARK
- _add_win_loss(black_name, white_name)
+ _add_win_loss(black_name, white_name, time)
elsif black_mark == LOSS_MARK && white_mark == WIN_MARK
- _add_win_loss(white_name, black_name)
+ _add_win_loss(white_name, black_name, time)
elsif black_mark == DRAW_MARK && white_mark == DRAW_MARK
return
else
if /^N\-(.*)$/ =~ str then white_name = $1.strip end
if /^'summary:(.*)$/ =~ str
- dummy, p1, p2 = $1.split(":").map {|a| a.strip}
+ state, p1, p2 = $1.split(":").map {|a| a.strip}
+ return if state == "abnormal"
p1_name, p1_mark = p1.split(" ")
p2_name, p2_mark = p2.split(" ")
if p1_name == black_name
Dir.glob( File.join(dir, "**", "*.csa") ) {|f| grep(f)}
end
- obj = WinLossMatrix::mk_win_loss_matrix($players)
yaml = {}
yaml["players"] = {}
- rating_group = 0
- obj.connected_subsets.each do |win_loss_matrix|
- yaml["players"][rating_group] = {}
-
- rating = Rating.new(win_loss_matrix.matrix)
- rating.rating
- rating.average!(Rating::AVERAGE_RATE)
- rating.integer!
-
- win_loss_matrix.keys.each_with_index do |p, i| # player_id, index#
- win = win_loss_matrix.matrix.row(i).sum
- loss = win_loss_matrix.matrix.col(i).sum
-
- yaml["players"][rating_group][p] =
- { 'name' => p.split("+")[0],
- 'rating_group' => rating_group,
- 'rate' => rating.rate[i],
- 'last_modified' => $players_time[p].dup,
- 'win' => win,
- 'loss' => loss}
+ if $players.size > 0
+ obj = WinLossMatrix::mk_win_loss_matrix($players)
+ rating_group = 0
+ obj.connected_subsets.each do |win_loss_matrix|
+ yaml["players"][rating_group] = {}
+
+ rating = Rating.new(win_loss_matrix.matrix)
+ rating.rating
+ rating.average!(Rating::AVERAGE_RATE)
+ rating.integer!
+
+ win_loss_matrix.keys.each_with_index do |p, i| # player_id, index#
+ win = win_loss_matrix.matrix.row(i).sum
+ loss = win_loss_matrix.matrix.col(i).sum
+
+ yaml["players"][rating_group][p] =
+ { 'name' => p.split("+")[0],
+ 'rating_group' => rating_group,
+ 'rate' => rating.rate[i],
+ 'last_modified' => $players_time[p].dup,
+ 'win' => win,
+ 'loss' => loss}
+ end
+ rating_group += 1
end
- rating_group += 1
end
puts yaml.to_yaml
end