OSDN Git Service

Improved stability of test results.
[shogi-server/shogi-server.git] / mk_rate
diff --git a/mk_rate b/mk_rate
index e3350e5..f935acb 100755 (executable)
--- a/mk_rate
+++ b/mk_rate
@@ -34,6 +34,9 @@
 # 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
 #
@@ -591,13 +598,21 @@ def half_life(days)
 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
@@ -608,7 +623,11 @@ def add(black_mark, black_name, white_name, white_mark, time)
   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
@@ -635,6 +654,7 @@ def parse(line)
 
   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)
 
@@ -662,11 +682,14 @@ def usage(io)
 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
@@ -674,11 +697,13 @@ 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|
@@ -699,6 +724,11 @@ def main
     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