# Homepage:: http://sourceforge.jp/projects/shogi-server/
#
#--
-# Copyright (C) 2006-2009 Daigo Moriwaki <daigo at debian dot org>
+# Copyright (C) 2006-2012 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
# m [days] (default 7)
# after m days, the half-life effect works
#
+# --ignore::
+# m [days] (default 365*2)
+# old results will be ignored
+#
# --fixed-rate-player::
# player whose rate is fixed at the rate
#
require 'yaml'
require 'time'
require 'getoptlong'
-require 'gsl'
+require 'set'
require 'rubygems'
+require 'gsl'
require 'rgl/adjacency'
require 'rgl/connected_components'
$players = Hash.new
# Holds the last time when a player gamed
$players_time = Hash.new { Time.at(0) }
+# Holds history of input lines to check duplicated inputs
+$history = Set.new
#################################################
# Parse a game result line
#
def parse(line)
+ if $history.include? line
+ $stderr.puts "[WARNING] Duplicated: #{line}"
+ return
+ end
+ $history.add 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
return if state == "abnormal"
time = Time.parse(time)
return if $options["base-date"] < time
+ how_long_days = ($options["base-date"] - time)/(3600*24)
+ if (how_long_days > $options["ignore"])
+ return
+ end
+
black_id = identify_id(black_id)
white_id = identify_id(white_id)
--half-life n [days] (default 60)
--half-life-ignore m [days] (default 7)
after m days, half-life effect works
+ --ignore n [days] (default 730 [=365*2]).
+ Results older than n days from the 'base-date' are ignored.
--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
["--half-life", GetoptLong::REQUIRED_ARGUMENT],
["--half-life-ignore", GetoptLong::REQUIRED_ARGUMENT],
["--help", "-h", GetoptLong::NO_ARGUMENT],
+ ["--ignore", GetoptLong::REQUIRED_ARGUMENT],
["--fixed-rate-player", GetoptLong::REQUIRED_ARGUMENT],
["--fixed-rate", GetoptLong::REQUIRED_ARGUMENT],
["--skip-draw-games", GetoptLong::NO_ARGUMENT])
$options["half-life"] = $options["half-life"].to_i
$options["half-life-ignore"] ||= 7
$options["half-life-ignore"] = $options["half-life-ignore"].to_i
+ $options["ignore"] ||= 365*2
+ $options["ignore"] = $options["ignore"].to_i
$options["fixed-rate"] = $options["fixed-rate"].to_i if $options["fixed-rate"]
if ARGV.empty?