CGOS "rotation" script
[Posted by Urban Hafner on 10 Oct 2007]
While playing around with libEGO and trying to see how far I can get with a simple “all-moves-as-first” Monte Carlo bot. I wrote many (well, three) different versions of the same bot and tested them against each other. Of course for a real test I had to use CGOS. But as I only have one computer that I also use for work I had to run the different bots one after the other. To automate that I wrote a small script that lets you run any number of bots in rotation on CGOS.
It’s a very simple script written in Ruby, so you’ll need to have that installed. For the rest see the comments at the beginning of the file.
#!/usr/bin/env ruby
#
# Run bots one after the other on CGOS. The BOTS variable is an array
# if directories of the bots. In each of these directory there has to
# be an executable file called 'cgos.sh' that connects the bot to CGOS.
# This executable is also required to set the sentinel file name to the
# one given in the TERM variable below.
# Number of games for each bot
GAMES = 1
# The bots that should play
BOTS = ["libEGO-AMAF", "libEGO-AMAF-2", "libEGO-AMAF-3"]
# Sentinel filename to be used by CGOS
TERM = "stop.txt"
round = 0
if ARGV.length > 0 and ARGV.first == "stop"
File.new(TERM, "w")
exit
end
# Clean up (if script wasn't terminated correctly)
(BOTS+["."]).each do |dir|
Dir.chdir do
File.delete(TERM) if File.exists?(TERM)
end
end
until(File.exists?(TERM))
dir = BOTS[round % BOTS.length]
puts "[#{Time.now}] Round #{round+1}"
puts "[#{Time.now}] Running '#{dir}' for #{GAMES} games"
last_was_print = false
Dir.chdir(dir) do
games = 0
IO.popen('./cgos.sh 2>/dev/null') do |pipe|
until(pipe.eof?)
line = pipe.gets
if line =~ /setup/
games += 1
File.new(TERM, "w") if games >= (GAMES-1)
end
case line
when /gameover/
line =~ /gameover\s+\d\d\d\d-\d\d-\d\d\s+(\S+)/
print "\n" if last_was_print
puts "[#{Time.now}] #{$1}"
last_was_print = false
when /setup/
line =~ /setup\s+.*?(\S+\(.*\)\s+\S+\(.*\))/
print "\n" if last_was_print
puts "[#{Time.now}] #{$1}"
last_was_print = false
when /info/
print "."
STDOUT.flush
last_was_print = true
end
end
end
File.delete(TERM)
end
round += 1
end
File.delete(TERM)