X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=mk_rate;h=103988d13702561fe6e8c8001c1ae8a5a5650a3c;hb=bb0d4525602167024caaa24fceef0838d7d16c52;hp=8b1e770c4f1ea8f05e0becc4ef7fd4021b4d5cd0;hpb=39513052c4fc30ada0cbc0e4b70753701c893ee5;p=shogi-server%2Fshogi-server.git diff --git a/mk_rate b/mk_rate index 8b1e770..103988d 100755 --- a/mk_rate +++ b/mk_rate @@ -1,11 +1,11 @@ -#!/usr/bin/ruby1.9.1 +#!/usr/bin/ruby # $Id$ # # Author:: Daigo Moriwaki # Homepage:: http://sourceforge.jp/projects/shogi-server/ # #-- -# Copyright (C) 2006-2009 Daigo Moriwaki +# Copyright (C) 2006-2012 Daigo Moriwaki # # 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 @@ -35,12 +35,18 @@ # ./mk_rate [options] # # GAME_RESULTS_FILE:: -# a path to a file listing results of games, which is genrated by the +# a path to a file listing results of games, which is generated by the # mk_game_results command. # In the second style above, the file content can be read from the stdin. # +# --abnormal-threshold:: +# n [plies] (default 30) +# Games that end with the 'abnormal' status are counted in win/lost games +# for the rating calculation if a game plays more than n plies. Otherwise +# (or if n is zero), abnormal games are counted out of rating games. +# # --base-date:: -# a base time point for this calicuration (default now). Ex. '2009-10-31' +# a base time point for this calculation (default now). Ex. '2009-10-31' # # --half-life:: # n [days] (default 60) @@ -49,6 +55,10 @@ # 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 # @@ -64,11 +74,11 @@ # # == PREREQUIRE # -# Sample Command lines that isntall prerequires will work on Debian. +# Sample Command lines that install prerequires will work on Debian. # -# * Ruby 1.9.3 or 1.8.7 (including Rubygems) +# * Ruby 2.0.0 or later (including Rubygems) # -# $ sudo aptitude install ruby1.9.1 +# $ sudo aptitude install ruby # # * Ruby bindings for the GNU Scientific Library (GSL[http://rb-gsl.rubyforge.org/]) # @@ -76,7 +86,7 @@ # # * RGL: {Ruby Graph Library}[http://rubyforge.org/projects/rgl/] # -# $ sudo gem1.9.1 install rgl +# $ sudo gem install rgl # # == Examples # @@ -97,11 +107,15 @@ # * (Rated) players, who played more than $GAMES_LIMIT [15] (rated) games. # +require 'pathname' +$:.unshift(File.dirname(Pathname.new(__FILE__).realpath)) +require 'utils/csa-filter' require 'yaml' require 'time' require 'getoptlong' -require 'gsl' +require 'set' require 'rubygems' +require 'gsl' require 'rgl/adjacency' require 'rgl/connected_components' @@ -119,6 +133,8 @@ DRAW_MARK = "draw" $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 ################################################# @@ -650,6 +666,12 @@ end # 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 @@ -657,9 +679,19 @@ def parse(line) return end - return if state == "abnormal" + if state == "abnormal" + csa = CsaFileReader.new(file, "EUC-JP") + if $options["abnormal-threshold"] == 0 || csa.ply <= $options["abnormal-threshold"] + return + end + end 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) @@ -697,6 +729,8 @@ OPTOINS: --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 @@ -708,13 +742,15 @@ 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], - ["--skip-draw-games", GetoptLong::NO_ARGUMENT]) + ["--abnormal-threshold", GetoptLong::REQUIRED_ARGUMENT], + ["--base-date", GetoptLong::REQUIRED_ARGUMENT], + ["--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]) parser.quiet = true begin parser.each_option do |name, arg| @@ -740,10 +776,14 @@ def main else $options["base-date"] = Time.now end + $options["abnormal-threshold"] ||= 30 + $options["abnormal-threshold"] = $options["abnormal-threshold"].to_i $options["half-life"] ||= 60 $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?