OSDN Git Service

In a case of the Errno::ECONNRESET error, the error is correctly logged to the server...
[shogi-server/shogi-server.git] / mk_rate
diff --git a/mk_rate b/mk_rate
index a035783..e3350e5 100755 (executable)
--- a/mk_rate
+++ b/mk_rate
@@ -5,7 +5,7 @@
 # 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
@@ -466,14 +466,19 @@ class WinLossMatrix
   end
 
   ##
-  # Removes a delete_index'th player and returns a new object.
+  # Removes players in a rows such as [1,3,5], and then returns a new
+  # object.
   #
-  def delete_row(delete_index)
+  def delete_rows(rows)
+    rows = rows.sort.reverse
+
     copied_cols = []
     (0...size).each do |i|
-      next if i == delete_index
+      next if rows.include?(i)
       row = @matrix.row(i).clone
-      row.delete_at(delete_index)
+      rows.each do |j|
+        row.delete_at(j)
+      end
       copied_cols << row
     end
     if copied_cols.size == 0
@@ -481,20 +486,13 @@ class WinLossMatrix
     else
       new_matrix = GSL::Matrix[*copied_cols]
     end
-    new_keys = @keys.clone
-    new_keys.delete_at(delete_index)
-    return WinLossMatrix.new(new_keys, new_matrix)
-  end
 
-  ##
-  # Removes players in a rows; [1,3,5]
-  #
-  def delete_rows(rows)
-    obj = self
-    rows.sort.reverse.each do |index|
-      obj = obj.delete_row(index)
+    new_keys = @keys.clone
+    rows.each do |j|
+      new_keys.delete_at(j)
     end
-    obj
+
+    return WinLossMatrix.new(new_keys, new_matrix)
   end
 
   ##
@@ -625,46 +623,25 @@ def identify_id(id)
   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)
-  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
+# 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
-end
 
-def usage
-  $stderr.puts <<-EOF
-USAGE: #{$0} dir [...]
-  EOF
-  exit 1
+  return if state == "abnormal"
+  time = Time.parse(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
 
 def validate(yaml)
@@ -728,8 +705,18 @@ def main
   $options["half-life-ignore"] = $options["half-life-ignore"].to_i
   $options["fixed-rate"] = $options["fixed-rate"].to_i if $options["fixed-rate"]
 
-  while dir = ARGV.shift do
-    Dir.glob( File.join(dir, "**", "*.csa") ) {|f| grep(f)}
+  if ARGV.empty?
+    while line = $stdin.gets do
+      parse line.strip
+    end
+  else
+    while file = ARGV.shift do
+      File.open(file) do |f|
+        f.each_line do |line|
+          parse line.strip
+        end
+      end 
+    end
   end
 
   yaml = {}