OSDN Git Service

For ease to see in the players.yaml.
[shogi-server/shogi-server.git] / mk_rate
diff --git a/mk_rate b/mk_rate
index 2b99a7a..44fa586 100755 (executable)
--- a/mk_rate
+++ b/mk_rate
@@ -76,12 +76,12 @@ class Rating
                        # the probability that x wins y
                        @win_rate_matrix = Matrix[*
                                (@rate.collect do |x|
-                               (@rate.collect do |y|
-                                       #     exp(x)
-                                       # ---------------
-                                       # exp(x) + exp(y)
-                                       1.0/(1.0+exp(K*(y-x)))
-                               end)
+                                 (@rate.collect do |y|
+                                         #      1
+                                         # --------------
+                                         #  1 + exp(y-x)
+                                         1.0/(1.0+exp(y-x))
+                                 end)
                                end)
                        ]
 
@@ -108,11 +108,12 @@ class Rating
                        ]
 
                        # gets the next value
-                       @rate += errorVector * (1.0/K)
+                       @rate += errorVector
                        $stderr.printf "|error| : %5.2e\n", errorVector.r if $DEBUG
 
                end while (errorVector.r > ERROR_LIMIT * @rate.r)
                
+    @rate *= 1.0/K
                self
        end
 
@@ -180,19 +181,29 @@ end
 def grep(file)
        str = File.open(file).read
 
-       black_mark = ""; white_mark = ""
-       time = nil
-
-       str.gsub(/^'summary:(.*)$/) do |line|
-               dummy, sente, gote = $1.split(":").map {|a| a.strip}
-               black_mark, white_mark = [sente,gote].map {|p| p.split(" ")[1]}
+  if /^N\+(.*)$/ =~ str then black_name = $1.strip end
+  if /^N\-(.*)$/ =~ str then white_name = $1.strip end
+
+       if /^'summary:(.*)$/ =~ str
+               dummy, p1, p2 = $1.split(":").map {|a| a.strip}    
+    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} #{p1} #{p2}"
+    end
        end
-       str.gsub(/^'\$END_TIME:(.*)$/) do |line|
+       if /^'\$END_TIME:(.*)$/ =~ str
     time = Time.parse($1.strip)
        end
        if /^'rating:(.*)$/ =~ str
-         black_name, white_name = $1.split(":").map {|a| a.strip}
-         add(black_mark, black_name, white_name, white_mark, time)
+         black_id, white_id = $1.split(":").map {|a| a.strip}
+         add(black_mark, black_id, white_id, white_mark, time)
        end
 end
 
@@ -206,21 +217,27 @@ end
 def main
        usage if ARGV.empty?
        while dir = ARGV.shift do
-               Dir.glob( File.join("**", "*.csa") ) {|f| grep(f)}
+               Dir.glob( File.join(dir, "**", "*.csa") ) {|f| grep(f)}
        end
 
        win_loss_matrix, keys = mk_win_loss_matrix($players)
+  $stderr.puts keys.inspect if $DEBUG
+  $stderr.puts win_loss_matrix.inspect if $DEBUG
        rating = Rating.new(win_loss_matrix)
        rating.rating
        rating.average!(AVERAGE_RATE)
        rating.integer!
 
        yaml = {}
-       keys.each_with_index do |p, i|
+       keys.each_with_index do |p, i| # player_id, index#
+               win_loss = $players[p].values.inject(Vector[0,0]) {|sum, v| sum + v}
+    win = win_loss_matrix
                yaml[p] = 
                        { 'name' => p.split("+")[0],
                    'rate' => rating.rate[i],
-                   'last_modified' => $players_time[p]}
+                   'last_modified' => $players_time[p].dup,
+                   'win'  => win_loss[0],
+                   'loss' => win_loss[1]}
        end
        puts yaml.to_yaml
 end