-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathranking
executable file
·94 lines (78 loc) · 2.27 KB
/
ranking
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/env ruby
require 'json'
experiment_name = ARGV.first
if experiment_name.nil?
puts "Name of experiment required as argument!"
exit 1
end
def latest_generation
generations = Dir["*"].find_all {|f| File.directory?(f)}
generations.uniq.sort_by {|d| d.to_i }.last
end
experiment_dir = "experiments/#{experiment_name}"
MAX = 10
def median(array)
return nil if array.empty?
sorted = array.sort
len = sorted.length
n = (sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0
n.round(0) == n ? n.to_i : n
end
def average(array)
return nil if array.empty?
total = array.sum
(total.to_f / array.length).round
end
def compute_game_lengths
Dir["*.dat"].map do |file_name|
result = File.readlines(file_name).last.split
game_length = result[6]
game_length.to_i
end
end
Dir.chdir(experiment_dir) do
loop do
generation = latest_generation
Dir.chdir(generation) do
break unless File.exist?("data.json")
# Reading while file is being written
data = begin
JSON.load_file("data.json")
rescue
nil
end
break unless data
rankings = data["ranking"]
scores = rankings.map {|player| player['score'] }
min_score = scores.min
max_score = scores.max
median_score = median(scores)
average_score = average(scores)
game_lengths = compute_game_lengths
puts "\033[2J\033[H"
puts "\033[3mGeneration: #{generation} Round: #{data['round']+1}"
puts "Score: min = #{min_score} max = #{max_score} median = #{median_score} average = #{average_score}"
puts "Game length: min = #{game_lengths.min} max = #{game_lengths.max} median = #{median(game_lengths)} average = #{average(game_lengths)}\033[0m\n\n"
skipped = false
rankings.each_with_index do |player, i|
external = data['players'][player['name']]['external']
if (i >= MAX) && !external
skipped = true
next
end
num = "#{i+1}.".rjust(4)
str = "#{num} #{player["name"].rjust(13)} Score: #{player["score"]}"
if skipped
str = " ...\n#{str}"
skipped = false
end
if external
puts "\033[1m#{str}\033[0m"
else
puts str
end
end
end
sleep 10
end
end