Here’s the updated cgos.rb script. The main change is that the bots are chosen at random (instead of in the order specified).
#!/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.
# :bot :: The directory containing you cgos connection script
# :script :: The name of the script (defaults to cgos.sh)
# :games :: The number of games the bot should play in a row
BOTS = [
{:bot => "libEGO-AMAF-3"},
{:bot => "libEGO-AMAF-2"},
{:bot => "erlygo"},
{:bot => "libEGO-AMAF-2", :script => "cgos19.sh"},
{:bot => "libEGO-AMAF-3", :script => "cgos19.sh"},
{:bot => "erlygo", :script => "cgos19.sh"}
]
# Sentinel filename to be used by CGOS
TERM = "stop.txt"
$verbose = false
round = 0
total_games = 0
games = Hash.new {|h,k| h[k] = 0}
opts = OptionParser.new
opts.on("-v", "--verbose") {$verbose = true }
opts.on("-s", "--stop") do
File.new(TERM, "w")
exit
end
opts.parse(ARGV)
Time.now.strftime("%H:%M:%S")
end
# Clean up (if script wasn't terminated correctly)
(BOTS+[{:bot => "."}]).each do |bot|
bot[:games] = 1 unless bot[:games]
bot[:script] = "cgos.sh" unless bot[:script]
Dir.chdir(bot[:bot]) do
File.delete(TERM) if File.exists?(TERM)
end
end
until(File.exists?(TERM))
round += 1
if (round % 5).zero?
games.each do |k,v|
puts " games for ''"
end
end
bot = BOTS[rand(BOTS.length)]
puts "[] Running '' () for games"
last_was_print = false
Dir.chdir(bot[:bot]) do
IO.popen("./ 2>/dev/null") do |pipe|
until(pipe.eof?)
line = pipe.gets
if $verbose
puts line
STDOUT.flush
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 "[] "
last_was_print = false
when /setup/
File.new(TERM, "w") if games[bot[:bot]] >= (bot[:games]-1)
games[bot[:bot]] += 1
total_games += 1
line =~ /setup\s+.*?(\S+\(.*\)\s+\S+\(.*\))/
print "\n" if last_was_print
stats = "(game of , games in total)"
puts "[] "
last_was_print = false
when /info/
unless $verbose
print "."
STDOUT.flush
last_was_print = true
end
end
end
end
File.delete(TERM) if File.exists?(TERM)
end
round += 1
end
File.delete(TERM)
Here’s the updated cgos.rb script. The main change is that the bots are chosen at random (instead of in the order specified).
#!/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.
# :bot :: The directory containing you cgos connection script
# :script :: The name of the script (defaults to cgos.sh)
# :games :: The number of games the bot should play in a row
BOTS = [
{:bot => "libEGO-AMAF-3"},
{:bot => "libEGO-AMAF-2"},
{:bot => "erlygo"},
{:bot => "libEGO-AMAF-2", :script => "cgos19.sh"},
{:bot => "libEGO-AMAF-3", :script => "cgos19.sh"},
{:bot => "erlygo", :script => "cgos19.sh"}
]
# Sentinel filename to be used by CGOS
TERM = "stop.txt"
$verbose = false
round = 0
total_games = 0
games = Hash.new {|h,k| h[k] = 0}
opts = OptionParser.new
opts.on("-v", "--verbose") {$verbose = true }
opts.on("-s", "--stop") do
File.new(TERM, "w")
exit
end
opts.parse(ARGV)
Time.now.strftime("%H:%M:%S")
end
# Clean up (if script wasn't terminated correctly)
(BOTS+[{:bot => "."}]).each do |bot|
bot[:games] = 1 unless bot[:games]
bot[:script] = "cgos.sh" unless bot[:script]
Dir.chdir(bot[:bot]) do
File.delete(TERM) if File.exists?(TERM)
end
end
until(File.exists?(TERM))
round += 1
if (round % 5).zero?
games.each do |k,v|
puts " games for ''"
end
end
bot = BOTS[rand(BOTS.length)]
puts "[] Running '' () for games"
last_was_print = false
Dir.chdir(bot[:bot]) do
IO.popen("./ 2>/dev/null") do |pipe|
until(pipe.eof?)
line = pipe.gets
if $verbose
puts line
STDOUT.flush
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 "[] "
last_was_print = false
when /setup/
File.new(TERM, "w") if games[bot[:bot]] >= (bot[:games]-1)
games[bot[:bot]] += 1
total_games += 1
line =~ /setup\s+.*?(\S+\(.*\)\s+\S+\(.*\))/
print "\n" if last_was_print
stats = "(game of , games in total)"
puts "[] "
last_was_print = false
when /info/
unless $verbose
print "."
STDOUT.flush
last_was_print = true
end
end
end
end
File.delete(TERM) if File.exists?(TERM)
end
round += 1
end
File.delete(TERM)
Today was the January 2007 KGS bot tournament and version 0.5 of HouseBot managed to get on the 7th of 10 places. What’s even more noteworthy is that it managed to beat version 0.4 which is a first. That’s probably due to the improved search (a Transposition Table was introduced) and due to some minor enhancements in Life & Death analysis (the first step beyond Benson).
The next goal will be to beat 0.4 consistently and retire it completely. I hope this will be possible until next months tournament.
Today was the January 2007 KGS bot tournament and version 0.5 of HouseBot managed to get on the 7th of 10 places. What’s even more noteworthy is that it managed to beat version 0.4 which is a first. That’s probably due to the improved search (a Transposition Table was introduced) and due to some minor enhancements in Life & Death analysis (the first step beyond Benson).
The next goal will be to beat 0.4 consistently and retire it completely. I hope this will be possible until next months tournament.