/script/analyze_result_log.py

https://github.com/yaneurao/YaneuraOu
Python | 104 lines | 71 code | 22 blank | 11 comment | 27 complexity | eaa22c6b893bdacb0407c563ff68f1bc MD5 | raw file
  1. # -*- coding: utf8 -*-
  2. '''
  3. やねうら王 2017 Earlyのランダムパラメーター機能で探索パラメーターを変化させて
  4. 対局させたときのログを集計して一番勝率の高いものを選ぶための分析スクリプト
  5. '''
  6. import os
  7. import sys
  8. import glob
  9. import math
  10. from collections import OrderedDict
  11. params = OrderedDict()
  12. res = {}
  13. res["win"] = 0
  14. res["lose"] = 0
  15. res["draw"] = 0
  16. def analyze_log(file_path):
  17. # print "file_path = " + file_path
  18. with open(file_path, 'rb') as fi:
  19. last_line = ""
  20. for line in fi.readlines():
  21. if ("draw" in line) or ("win" in line) or ("lose" in line):
  22. # "gameover win""win"の部分を取り出す
  23. result = line.split(' ')[1].strip()
  24. res[result] += 1
  25. plist = last_line.split(",");
  26. # PARAM1:123,PARAM2:234,...のように並んでいる
  27. for p in plist:
  28. q = p.split(":")
  29. # 末尾のカンマの可能性がある
  30. if len(q) < 2:
  31. continue
  32. # keyがなければ作る
  33. if not q[0] in params:
  34. params[q[0]] = {}
  35. if not q[1] in params[q[0]]:
  36. params[q[0]][q[1]] = {}
  37. if not result in params[q[0]][q[1]]:
  38. params[q[0]][q[1]][result] = 0
  39. params[q[0]][q[1]][result] += 1
  40. last_line = line
  41. def rating(win,lose,draw):
  42. total = win + lose
  43. if total != 0 :
  44. win_rate = win / float(win+lose)
  45. else:
  46. win_rate = 0
  47. if win_rate == 0 or win_rate == 1:
  48. rating = ""
  49. else:
  50. rating = " R" + str(round(-400*math.log(1/win_rate-1,10),2))
  51. return str(win) + " - " + str(draw) + " - " + str(lose) + "(" + str(round(win_rate*100,2)) + "%" + rating + ")"
  52. if __name__ == '__main__':
  53. # print os.path.join(sys.argv[1], '*', 'log')
  54. for file_path in sorted(glob.glob(os.path.join(sys.argv[1], '*.log'))):
  55. fig = analyze_log(file_path)
  56. sys.stdout.write(".")
  57. print
  58. print ("total : " + rating(res["win"],res["lose"],res["draw"]))
  59. t_win = t_lose = t_draw = 0
  60. first = True
  61. for key,param in params.items():
  62. if first:
  63. first = False
  64. for key2,result in param.items():
  65. if "win" in result:
  66. t_win += result["win"]
  67. if "lose" in result:
  68. t_lose += result["lose"]
  69. if "draw" in result:
  70. t_draw += result["draw"]
  71. total = t_win+t_lose+t_draw
  72. print " total : " + rating(t_win,t_lose,t_draw)
  73. print key + ":"
  74. for key2,result in sorted(param.items(),key = lambda x:int(x[0])):
  75. win = lose = draw = 0
  76. if "win" in result:
  77. win = result["win"]
  78. if "lose" in result:
  79. lose = result["lose"]
  80. if "draw" in result:
  81. draw = result["draw"]
  82. print " " + key2 + " : " + rating(win,lose,draw)