Commit e8a611c5 authored by Sam Moore's avatar Sam Moore

Fixing simulate.py

Now reads the round number from an "info" file, instead of counting number of files in the directory.

Fixed errors in simulate.py creating .html files.

Made results slightly prettier, moved directory to /web/results
Included links to raw log files /web/log for games.

Should install an apache server on mufasa, so that people can view the results online.
parent f74c2985
asmodeus.py
Sam Moore
python
Sample AI - Improves <a href=basic_python.html>basic_python</a> Scores moves based on paths towards enemy units and known combat outcomes, chooses highest scoring move.
basic_cpp
Sam Moore
C++
Sample AI - Provides classes that obey the manager program's protocol, and stores the state of the board and pieces, but only makes randomised moves.
basic_python.py
Sam Moore
python
Sample AI - Provides classes that obey the manager program's protocol, and stores the state of the board and pieces, but only makes randomised moves.
vixen.py
Sam Moore
python
Sample AI - An improvement on <a href=asmodeus.html>asmodeus'</a> score optimisation. Considers probabilities for unknown enemy units, and sums scores for paths with common first move.
......@@ -3,8 +3,8 @@
# Used for building/removing results
BASEDIR = /home/sam/Documents/progcomp2012/progcomp
RESULTSDIR = /home/sam/Documents/progcomp2012/progcomp/results
LOGDIR = /home/sam/Documents/progcomp2012/progcomp/log
RESULTSDIR = /home/sam/Documents/progcomp2012/progcomp/web/results
LOGDIR = /home/sam/Documents/progcomp2012/progcomp/web/log
AGENTSDIR = /home/sam/Documents/progcomp2012/progcomp/agents
MANAGER = /home/sam/Documents/progcomp2012/progcomp/judge/manager/stratego
......@@ -13,3 +13,4 @@ MANAGER = /home/sam/Documents/progcomp2012/progcomp/judge/manager/stratego
clean:
rm -r -f $(RESULTSDIR)
rm -r -f $(LOGDIR)
......@@ -39,8 +39,8 @@ if len(sys.argv) >= 6:
print "Useage: " +sys.argv[0] + " [nRounds=1] [nGames=10] [baseDirectory=\""+baseDirectory+"\"] [managerPath=baseDirectory+\"/judge/manager/stratego\"]"
sys.exit(1)
resultsDirectory = baseDirectory+"/results/" #Where results will go (results are in the form of text files of agent names and scores)
logDirectory = baseDirectory+"/log/" #Where log files go (direct output of manager program)
resultsDirectory = baseDirectory+"/web/results/" #Where results will go (results are in the form of text files of agent names and scores)
logDirectory = baseDirectory+"/web/log/" #Where log files go (direct output of manager program)
agentsDirectory = baseDirectory+"/agents/" #Where agents are found (each agent has its own subdirectory within this directory)
managerPath = baseDirectory+"/judge/manager/stratego" #Path to the executable that plays the games
if len(sys.argv) >= 5:
......@@ -65,16 +65,22 @@ if os.path.exists(managerPath) == False:
if os.path.exists(resultsDirectory) == False:
os.mkdir(resultsDirectory) #Make the results directory if it didn't exist
'''
Obselete older version doesn't work with new .html files
#Identify the round number by reading the results directory
totalRounds = len(os.listdir(resultsDirectory)) + 1
if totalRounds > 1:
totalRounds -= 1
'''
totalRounds = 1
#TODO: Fix this bit!
#Identify the round number by reading from the "info" file in the results directory, if it doesn't exist then start at round 1.
if os.path.exists(resultsDirectory+"info") == False:
totalRounds = 1
else:
info = open(resultsDirectory+"info", "r")
totalRounds = int(info.readline().strip())
info.close()
os.remove(resultsDirectory+"info")
info = open(resultsDirectory+"info", "w")
info.write(str(totalRounds + nRounds) + "\n")
info.close()
if os.path.exists(logDirectory) == False:
os.mkdir(logDirectory) #Make the log directory if it didn't exist
......@@ -106,7 +112,18 @@ for name in agentNames:
sys.stdout.write(" Invalid! (No \"info\" file found)\n")
continue
agentExecutable = agentsDirectory+name+"/"+(open(agentsDirectory+name+"/info").readline().strip())
infoFile = open(agentsDirectory+name+"/info", "r")
agentExecutable = agentsDirectory+name+"/"+(infoFile.readline().strip())
author = infoFile.readline().strip()
language = infoFile.readline().strip()
description = ""
while True:
line = infoFile.readline()
if len(line) > 0:
description += line
else:
break
infoFile.close()
if os.path.exists(agentExecutable) == False:
if verbose:
......@@ -119,7 +136,7 @@ for name in agentNames:
#Convert array of valid names into array of dictionaries containing information about each agent
#I'm starting to like python...
agents.append({"name":name, "path":agentExecutable, "score":[0], "VICTORY":[], "DEFEAT":[], "DRAW":[], "ILLEGAL":[], "DEFAULT":[], "INTERNAL_ERROR":[], "SURRENDER":[], "DRAW_DEFAULT":[], "BOTH_ILLEGAL":[], "BAD_SETUP":[], "ALL":[], "totalScore":0, "Wins":0, "Losses":0, "Draws":0, "Illegal":0, "Errors":0})
agents.append({"name":name, "path":agentExecutable, "author":author, "language":language, "description":description, "score":[0], "VICTORY":[], "DEFEAT":[], "DRAW":[], "ILLEGAL":[], "DEFAULT":[], "INTERNAL_ERROR":[], "SURRENDER":[], "DRAW_DEFAULT":[], "BOTH_ILLEGAL":[], "BAD_SETUP":[], "ALL":[], "totalScore":0, "Wins":0, "Losses":0, "Draws":0, "Illegal":0, "Errors":0})
if len(agents) == 0:
print "Couldn't find any agents! Check paths (Edit this script) or generate \"info\" files for agents."
......@@ -131,23 +148,25 @@ if verbose:
#Prepare the pretty .html files if they don't exist
if verbose:
print "Preparing .html results files..."
htmlDir = resultsDirectory + "pretty/"
if os.path.exists(htmlDir) == False:
os.mkdir(htmlDir)
if os.path.exists(htmlDir) == False:
print "Couldn't create directory \""+htmlDir+"\"."
sys.exit(1)
for agent in agents:
if os.path.exists(htmlDir+agent["name"] + ".html") == False:
agentFile = open(htmlDir+agent["name"] + ".html", "w")
agentFile.write("<html>\n<head>\n <title> " + agent["name"] + " results</title>\n</head>\n<body>\n<h1> Results for " + agent["name"]+" </h1>\n</body>\n</html>\n")
if os.path.exists(resultsDirectory+agent["name"] + ".html") == False:
agentFile = open(resultsDirectory+agent["name"] + ".html", "w")
agentFile.write("<html>\n<head>\n <title> " + agent["name"] + " overview</title>\n</head>\n<body>\n<h1> Overview for " + agent["name"]+" </h1>\n")
agentFile.write("<table border=\"0\" cellpadding=\"10\">\n")
agentFile.write("<tr> <th> Name </th> <th> Author </th> <th> Language </th> </tr>\n")
agentFile.write("<tr> <td> "+agent["name"]+" </td> <td> "+agent["author"]+" </td> <td> "+agent["language"]+" </td> </tr>\n")
agentFile.write("</table>\n");
agentFile.write("<p> <b>Description</b> </p>\n")
agentFile.write("<p> " + agent["description"] + " </p>\n")
agentFile.close()
os.rename(htmlDir+agent["name"] + ".html", "tmpfile")
os.rename(resultsDirectory+agent["name"] + ".html", "tmpfile")
oldFile = open("tmpfile", "r")
agentFile = open(htmlDir+agent["name"] + ".html", "w")
agentFile = open(resultsDirectory+agent["name"] + ".html", "w")
line = oldFile.readline()
while line != "":
#if verbose:
......@@ -169,7 +188,7 @@ for agent in agents:
line = oldFile.readline()
if verbose:
print "Prepared results file \"" + htmlDir+agent["name"] + ".html\"."
print "Prepared results file \"" + resultsDirectory+agent["name"] + ".html\"."
oldFile.close()
agentFile.close()
os.remove("tmpfile")
......@@ -206,7 +225,7 @@ for roundNumber in range(totalRounds, totalRounds + nRounds):
#Play a game and read the result. Note the game is logged to a file based on the agent's names
if verbose:
sys.stdout.write("Agents: \""+red["name"]+"\" and \""+blue["name"]+"\" playing game (ID: " + gameID + ") ... ")
logFile = logDirectory + "round"+str(roundNumber) + "/"+red["name"]+".vs."+blue["name"]+"."+str(i)
logFile = logDirectory + "round"+str(roundNumber) + "/"+red["name"]+".vs."+blue["name"]+"."+str(gameID)
outline = os.popen(managerPath + " -o " + logFile + " " + red["path"] + " " + blue["path"], "r").read()
results = outline.split(' ')
......@@ -317,7 +336,7 @@ for roundNumber in range(totalRounds, totalRounds + nRounds):
print "Updating pretty .html files... "
for agent in agents:
agentFile = open(htmlDir + agent["name"]+".html", "a")
agentFile = open(resultsDirectory + agent["name"]+".html", "a")
agentFile.write("<h2> Round " + str(roundNumber) + "</h2>\n")
agentFile.write("<h3> Round Overview </h3>\n")
agentFile.write("<table border=\"0\" cellpadding=\"10\">\n")
......@@ -325,13 +344,20 @@ for roundNumber in range(totalRounds, totalRounds + nRounds):
agentFile.write("<tr> <td> "+str(agent["score"][0])+" </td> <td> "+str(len(agent["VICTORY"]) + len(agent["DEFAULT"]))+" </td> <td> "+str(len(agent["DEFEAT"]) + len(agent["SURRENDER"]))+" </td> <td> "+str(len(agent["DRAW"]) + len(agent["DRAW_DEFAULT"]))+" </td> <td> "+str(len(agent["ILLEGAL"]) + len(agent["BOTH_ILLEGAL"]) + len(agent["BAD_SETUP"]))+" </td> <td> " +str(len(agent["INTERNAL_ERROR"]))+" </td> </tr>\n")
agentFile.write("</table>\n")
agentFile.write("<p> <a href=round"+str(roundNumber)+".html>Round "+str(roundNumber) + " Scoreboard</a></p>\n")
agentFile.write("<h3> Detailed </h3>\n")
agentFile.write("<table border=\"0\" cellpadding=\"10\">\n")
agentFile.write("<tr> <th> Game ID </th> <th> Opponent </th> <th> Played as </th> <th> Outcome </th> <th> Score </th> <th> Accumulated Score </th> </tr> </th>\n")
for index in range(0, len(agent["ALL"])):
agentFile.write("<tr> <td> " + str(agent["ALL"][index][1]) + " </td> <td> <a href="+agent["ALL"][index][0]+".html>"+agent["ALL"][index][0] + " </a> </td> <td> " + agent["ALL"][index][4] + " </td> <td> " + agent["ALL"][index][3] + " </td> <td> " + str(agent["ALL"][index][2]) + "</td> <td> " + str(agent["score"][len(agent["score"])-index -2]) + " </td> </tr> </th>\n")
if agent["ALL"][index][4] == "RED":
logFile = logDirectory + "round"+str(roundNumber) + "/"+agent["name"]+".vs."+agent["ALL"][index][0]+"."+str(agent["ALL"][index][1])
else:
logFile = logDirectory + "round"+str(roundNumber) + "/"+agent["ALL"][index][0]+".vs."+agent["name"]+"."+str(agent["ALL"][index][1])
agentFile.write("<tr> <td> <a href="+logFile+">" + str(agent["ALL"][index][1]) + " </a> </td> <td> <a href="+agent["ALL"][index][0]+".html>"+agent["ALL"][index][0] + " </a> </td> <td> " + agent["ALL"][index][4] + " </td> <td> " + agent["ALL"][index][3] + " </td> <td> " + str(agent["ALL"][index][2]) + "</td> <td> " + str(agent["score"][len(agent["score"])-index -2]) + " </td> </tr> </th>\n")
agentFile.write("</table>\n")
agent["totalScore"] += agent["score"][0]
......@@ -347,10 +373,12 @@ for roundNumber in range(totalRounds, totalRounds + nRounds):
agentFile.write("<tr> <td> "+str(agent["totalScore"])+" </td> <td> "+str(agent["Wins"])+" </td> <td> "+str(agent["Losses"])+" </td> <td> "+str(agent["Draws"])+" </td> <td> "+str(agent["Illegal"])+" </td> <td> " +str(agent["Errors"])+" </td> </tr>\n")
agentFile.write("</table>\n")
agentFile.close()
#Update round file
roundFile = open(htmlDir + "round"+str(roundNumber)+".html", "w")
roundFile = open(resultsDirectory + "round"+str(roundNumber)+".html", "w")
roundFile.write("<html>\n<head>\n <title> Round " +str(roundNumber)+ " Overview </title>\n</head>\n<body>\n")
roundFile.write("<h1> Round " +str(roundNumber)+ " Overview </h1>\n")
roundFile.write("<table border=\"0\" cellpadding=\"10\">\n")
......@@ -358,7 +386,9 @@ for roundNumber in range(totalRounds, totalRounds + nRounds):
agents.sort(key = lambda e : e["score"][0], reverse=True)
for agent in agents:
roundFile.write("<tr> <td> <a href="+agent["name"]+".html>"+agent["name"] + " </a> </td> <td> " + str(agent["score"][0]) + " </td> <td> " + str(agent["totalScore"]) + " </td> </tr>\n")
roundFile.write("</table>\n</body>\n<!-- Results file for Round " + str(roundNumber) + " autogenerated by \"" + sys.argv[0] + "\" at time " + str(time()) + " -->\n</html>\n\n")
roundFile.write("</table>\n")
roundFile.write("<p> <a href=total.html>Current Scoreboard</a></p>\n")
roundFile.write("</body>\n<!-- Results file for Round " + str(roundNumber) + " autogenerated by \"" + sys.argv[0] + "\" at time " + str(time()) + " -->\n</html>\n\n")
roundFile.close()
......@@ -368,17 +398,17 @@ for roundNumber in range(totalRounds, totalRounds + nRounds):
if verbose:
print "Finalising .html files... "
for agent in agents:
agentFile = open(htmlDir + agent["name"]+".html", "a")
agentFile = open(resultsDirectory + agent["name"]+".html", "a")
#Write the "total" statistics
agentFile.write("</body>\n<!-- Results file for \"" + agent["name"] + "\" autogenerated by \"" + sys.argv[0] + "\" at time " + str(time()) + " -->\n</html>\n\n")
agentFile.close()
if os.path.exists(htmlDir + "total.html") == True:
os.remove(htmlDir + "total.html") #Delete the file
if os.path.exists(resultsDirectory + "total.html") == True:
os.remove(resultsDirectory + "total.html") #Delete the file
totalFile = open(htmlDir + "total.html", "w")
totalFile = open(resultsDirectory + "total.html", "w")
totalFile.write("<html>\n<head>\n <title> Total Overview </title>\n</head>\n<body>\n")
totalFile.write("<h1> Total Overview </h1>\n")
totalFile.write("<table border=\"0\" cellpadding=\"10\">\n")
......@@ -386,7 +416,15 @@ totalFile.write("<tr> <th> Name </th> <th> Total Score </th> </tr>\n")
agents.sort(key = lambda e : e["totalScore"], reverse=True)
for agent in agents:
totalFile.write("<tr> <td> <a href="+agent["name"]+".html>"+agent["name"] + " </a> </td> <td> " + str(agent["totalScore"]) + " </td> </tr>\n")
totalFile.write("</table>\n</body>\n<!-- Total Results file autogenerated by \"" + sys.argv[0] + "\" at time " + str(time()) + " -->\n</html>\n\n")
totalFile.write("</table>\n")
totalFile.write("<h2> Round Summaries </h2>\n")
totalFile.write("<table border=\"0\" cellpadding=\"10\">\n")
for i in range(1, totalRounds+1):
totalFile.write("<tr> <td> <a href=round"+str(i)+".html>Round " + str(i) + "</a> </td> </tr>\n")
totalFile.write("</table>\n")
totalFile.write("</body>\n<!-- Total Results file autogenerated by \"" + sys.argv[0] + "\" at time " + str(time()) + " -->\n</html>\n\n")
totalFile.close()
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment