# DIR::
# CSA files are recursively looked up the directories.
#
+# --base-date::
+# a base time point for this calicuration (default now). Ex. '2009-10-31'
+#
# --half-life::
# n [days] (default 60)
#
# --fixed-rate::
# rate
#
+# --skip-draw-games::
+# skip draw games. [default: draw games are counted in as 0.5 win and 0.5
+# lost.]
+#
# --help::
# show this message
#
end
def _add_win_loss(winner, loser, time)
- how_long_days = (Time.now - time)/(3600*24)
+ how_long_days = ($options["base-date"] - 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*half_life(how_long_days),0]
$players[loser][winner] += GSL::Vector[0,1.0*half_life(how_long_days)]
end
+def _add_draw(player1, player2, time)
+ how_long_days = ($options["base-date"] - time)/(3600*24)
+ $players[player1] ||= Hash.new { GSL::Vector[0,0] }
+ $players[player2] ||= Hash.new { GSL::Vector[0,0] }
+ $players[player1][player2] += GSL::Vector[0.5*half_life(how_long_days),0.5*half_life(how_long_days)]
+ $players[player2][player1] += GSL::Vector[0.5*half_life(how_long_days),0.5*half_life(how_long_days)]
+end
+
def _add_time(player, time)
$players_time[player] = time if $players_time[player] < time
end
elsif black_mark == LOSS_MARK && white_mark == WIN_MARK
_add_win_loss(white_name, black_name, time)
elsif black_mark == DRAW_MARK && white_mark == DRAW_MARK
- return
+ if $options["skip-draw-games"]
+ return
+ else
+ _add_draw(black_name, white_name, time)
+ end
else
raise "Never reached!"
end
return if state == "abnormal"
time = Time.parse(time)
+ return if $options["base-date"] < time
black_id = identify_id(black_id)
white_id = identify_id(white_id)
USAGE: #{$0} [options] DIR..
DIR where CSA files are looked up recursively
OPTOINS:
+ --base-date a base time point for this calicuration (default now). Ex. '2009-10-31'
--half-life n [days] (default 60)
--half-life-ignore m [days] (default 7)
after m days, half-life effect works
--fixed-rate-player player whose rate is fixed at the rate
--fixed-rate rate
+ --skip-draw-games skip draw games. [default: draw games are counted in
+ as 0.5 win and 0.5 lost]
--help show this message
EOF
end
def main
$options = Hash::new
parser = GetoptLong.new(
+ ["--base-date", GetoptLong::REQUIRED_ARGUMENT],
["--half-life", GetoptLong::REQUIRED_ARGUMENT],
["--half-life-ignore", GetoptLong::REQUIRED_ARGUMENT],
["--help", "-h", GetoptLong::NO_ARGUMENT],
["--fixed-rate-player", GetoptLong::REQUIRED_ARGUMENT],
- ["--fixed-rate", GetoptLong::REQUIRED_ARGUMENT])
+ ["--fixed-rate", GetoptLong::REQUIRED_ARGUMENT],
+ ["--skip-draw-games", GetoptLong::NO_ARGUMENT])
parser.quiet = true
begin
parser.each_option do |name, arg|
usage($stdout)
exit 0
end
+ if $options["base-date"]
+ $options["base-date"] = Time::parse $options["base-date"]
+ else
+ $options["base-date"] = Time.now
+ end
$options["half-life"] ||= 60
$options["half-life"] = $options["half-life"].to_i
$options["half-life-ignore"] ||= 7