X-Git-Url: http://git.sourceforge.jp/view?p=shogi-server%2Fshogi-server.git;a=blobdiff_plain;f=mk_rate;h=1f9e54a013df157fbb637803b26fded4f868dada;hp=be2f8c0f344611f840817b552599ad9a94883cec;hb=d7dc48d302a0b0ffaeba2f7a05099912e148a1c6;hpb=498b1897371016e4bc0e303cab43b92a2c0b6e8b diff --git a/mk_rate b/mk_rate index be2f8c0..1f9e54a 100755 --- a/mk_rate +++ b/mk_rate @@ -1,11 +1,11 @@ -#!/usr/bin/ruby +#!/usr/bin/ruby1.9.1 # $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 @@ -49,6 +49,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 # @@ -66,21 +70,17 @@ # # Sample Command lines that isntall prerequires will work on Debian. # -# * Ruby 1.8.7 -# -# $ sudo aptitude install ruby1.8 -# -# * Rubygems +# * Ruby 1.9.3 or 1.8.7 (including Rubygems) # -# $ sudo aptitude install rubygems +# $ sudo aptitude install ruby1.9.1 # # * Ruby bindings for the GNU Scientific Library (GSL[http://rb-gsl.rubyforge.org/]) # -# $ sudo aptitude install libgsl-ruby1.8 +# $ sudo aptitude install ruby-gsl # # * RGL: {Ruby Graph Library}[http://rubyforge.org/projects/rgl/] # -# $ sudo gem install rgl +# $ sudo gem1.9.1 install rgl # # == Examples # @@ -104,8 +104,9 @@ require 'yaml' require 'time' require 'getoptlong' -require 'gsl' +require 'set' require 'rubygems' +require 'gsl' require 'rgl/adjacency' require 'rgl/connected_components' @@ -123,6 +124,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 ################################################# @@ -346,6 +349,7 @@ class Rating old_f = f old_f_nrm2 = old_f.nrm2 deaccelrate(1.0, old_rate, a, old_f_nrm2) + #@rate -= a # Instead, do not deaccelerate @record.set(func_vector.nrm2, @rate) $stderr.printf "|error| : %5.2e\n", a.nrm2 if $DEBUG @@ -362,6 +366,7 @@ class Rating @rate = @record.get $stderr.puts "resolved f: %s -> %f" % [func_vector.to_a.inspect, func_vector.nrm2] if $DEBUG + $stderr.puts "Count: %d" % [@count] if $DEBUG @rate *= 1.0/K finite! @@ -439,7 +444,7 @@ class WinLossMatrix 0 else p2 = keys[j] - v = p1_hash[p2] || Vector[0,0] + v = p1_hash[p2] || GSL::Vector[0,0] v[0] end end) @@ -652,6 +657,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 @@ -662,6 +673,11 @@ def parse(line) 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) @@ -699,6 +715,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 @@ -714,6 +732,7 @@ def main ["--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]) @@ -746,6 +765,8 @@ def main $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?