# Homepage:: http://sourceforge.jp/projects/shogi-server/
#
#--
-# Copyright (C) 2006-2008 Daigo Moriwaki <daigo at debian dot org>
+# Copyright (C) 2006-2009 Daigo Moriwaki <daigo at debian dot org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# 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)
#
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]
id.gsub(/@.*?\+/,"+")
end
-def grep(file)
- str = File.open(file).read
-
- if /^N\+(.*)$/ =~ str then black_name = $1.strip end
- if /^N\-(.*)$/ =~ str then white_name = $1.strip end
-
- if /^'summary:(.*)$/ =~ str
- 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
- black_name, black_mark = p1_name, p1_mark
- white_name, white_mark = p2_name, p2_mark
- elsif p2_name == black_name
- black_name, black_mark = p2_name, p2_mark
- white_name, white_mark = p1_name, p1_mark
- else
- raise "Never reach!: #{black} #{white} #{p3} #{p2}"
- end
- end
- if /^'\$END_TIME:(.*)$/ =~ str
- time = Time.parse($1.strip)
+# Parse a game result line
+#
+def parse(line)
+ time, state, black_mark, black_id, white_id, white_mark, file = line.split("\t")
+ unless time && state && black_mark && black_id &&
+ white_id && white_mark && file
+ $stderr.puts "Failed to parse the line : #{line}"
+ return
end
- if /^'rating:(.*)$/ =~ str
- black_id, white_id = $1.split(":").map {|a| a.strip}
- black_id = identify_id(black_id)
- white_id = identify_id(white_id)
- if black_id && white_id && (black_id != white_id) &&
- black_mark && white_mark
- add(black_mark, black_id, white_id, white_mark, time)
- 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)
+
+ if black_id && white_id && (black_id != white_id) &&
+ black_mark && white_mark
+ add(black_mark, black_id, white_id, white_mark, time)
end
end
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
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],
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
if ARGV.empty?
while line = $stdin.gets do
- next unless %r!.*\.csa$! =~ line
- grep line.strip
+ parse line.strip
end
else
- while dir = ARGV.shift do
- Dir.glob( File.join(dir, "**", "*.csa") ) {|f| grep(f)}
+ while file = ARGV.shift do
+ File.open(file) do |f|
+ f.each_line do |line|
+ parse line.strip
+ end
+ end
end
end