X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=progcomp%2Fjudge%2Fsimulator%2Fsimulate.py;h=aead755beaafc63361e2b9a6375d6791ee7ca236;hb=e8a611c553bd336550c50ed7491d5800a2ae7142;hp=5ad64485a46f91ea9a8816840f47c4c7fb9e21ba;hpb=e1a5a224763b1374c8dff6dcc2f5d85c15335eae;p=progcomp2012.git
diff --git a/progcomp/judge/simulator/simulate.py b/progcomp/judge/simulator/simulate.py
index 5ad6448..aead755 100755
--- a/progcomp/judge/simulator/simulate.py
+++ b/progcomp/judge/simulator/simulate.py
@@ -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,10 +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
-#Identify the round number by reading the results directory
-totalRounds = len(os.listdir(resultsDirectory)) + 1
-if totalRounds > 1:
- totalRounds -= 1
+
+
+#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
@@ -85,7 +97,6 @@ if verbose:
print "Identifying possible agents in \""+agentsDirectory+"\""
#Get all agent names from agentsDirectory
-#TODO: Move this part outside the loop? It only has to happen once
agentNames = os.listdir(agentsDirectory)
agents = []
for name in agentNames:
@@ -101,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:
@@ -114,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], "totalScore":0, "VICTORY":[], "DEFEAT":[], "DRAW":[], "ILLEGAL":[], "INTERNAL_ERROR":[], "ALL":[]})
+ 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."
@@ -124,31 +146,56 @@ if verbose:
print ""
#Prepare the pretty .html files if they don't exist
-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)
+if verbose:
+ print "Preparing .html results files..."
+
for agent in agents:
- if os.path.exists(htmlDir+agent["name"] + ".html") == False:
- agentFile = open(htmlDir+agent["name"] + ".html", "w")
- agentFile.write("\n
\n " + agent["name"] + " results\n\n\n Results for " + agent["name"]+"
\n\n\n")
+ if os.path.exists(resultsDirectory+agent["name"] + ".html") == False:
+ agentFile = open(resultsDirectory+agent["name"] + ".html", "w")
+ agentFile.write("\n\n " + agent["name"] + " overview\n\n\n Overview for " + agent["name"]+"
\n")
+ agentFile.write("\n")
+ agentFile.write(" Name | Author | Language |
\n")
+ agentFile.write(" "+agent["name"]+" | "+agent["author"]+" | "+agent["language"]+" |
\n")
+ agentFile.write("
\n");
+
+ agentFile.write(" Description
\n")
+ agentFile.write(" " + agent["description"] + "
\n")
agentFile.close()
- os.rename(htmlDir+agent["name"] + ".html", "tmpfile")
+ os.rename(resultsDirectory+agent["name"] + ".html", "tmpfile")
- oldFile = open("tmpfile")
- agentFile = open(htmlDir+agent["name"] + ".html", "w")
- for line in oldFile:
+ oldFile = open("tmpfile", "r")
+ agentFile = open(resultsDirectory+agent["name"] + ".html", "w")
+ line = oldFile.readline()
+ while line != "":
+ #if verbose:
+ # print "Interpreting line \"" + line.strip() + "\""
if line.strip() == "":
break
- agentFile.write(line.strip() + "\n")
+ elif line == " Score | Wins | Losses | Draws | Illegal | Errors |
\n":
+ agentFile.write(line)
+ line = oldFile.readline()
+
+ values = line.split(' ')
+ agent["totalScore"] += int(values[2].strip())
+ agent["Wins"] += int(values[5].strip())
+ agent["Losses"] += int(values[8].strip())
+ agent["Draws"] += int(values[11].strip())
+ agent["Illegal"] += int(values[14].strip())
+ agent["Errors"] += int(values[17].strip())
+ agentFile.write(line)
+ line = oldFile.readline()
+
+ if verbose:
+ print "Prepared results file \"" + resultsDirectory+agent["name"] + ".html\"."
oldFile.close()
agentFile.close()
os.remove("tmpfile")
+if verbose:
+ print ""
+
#Do each round...
totalGames = nGames/2 * len(agents) * (len(agents)-1)
for roundNumber in range(totalRounds, totalRounds + nRounds):
@@ -156,6 +203,9 @@ for roundNumber in range(totalRounds, totalRounds + nRounds):
if os.path.exists(logDirectory + "round"+str(roundNumber)) == False:
os.mkdir(logDirectory + "round"+str(roundNumber)) #Check there is a directory for this round's logs
+ for agent in agents:
+ agent.update({"name":agent["name"], "path":agent["path"], "score":[0], "VICTORY":[], "DEFEAT":[], "DRAW":[], "ILLEGAL":[], "DEFAULT":[], "INTERNAL_ERROR":[], "SURRENDER":[], "DRAW_DEFAULT":[], "BOTH_ILLEGAL":[], "BAD_SETUP":[], "ALL":[]})
+
print "Commencing ROUND " + str(roundNumber) + " combat!"
print "Total: " + str(totalGames) + " games to be played. This could take a while... (Estimate 60s/game)"
@@ -175,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(' ')
@@ -233,6 +283,8 @@ for roundNumber in range(totalRounds, totalRounds + nRounds):
print ""
#We should now have complete score values.
+ '''
+ Obselete, non prettified results
if verbose:
sys.stdout.write("Creating raw results files for ROUND " + str(roundNumber) + "... ")
@@ -269,48 +321,112 @@ for roundNumber in range(totalRounds, totalRounds + nRounds):
sys.stdout.write(" Complete!\n")
print "Finished writing results for ROUND " + str(roundNumber)
print ""
-
+ '''
if verbose:
print "RESULTS FOR ROUND " + str(roundNumber)
- totalFile = open(resultsDirectory+"total.scores", "w") #Recreate the file
- for agent in agents:
- totalFile.write(agent["name"] + " " + str(agent["totalScore"]) +"\n") #Write the total scores in descending order
- if verbose:
- print "Agent: " + str(agent)
+ #totalFile = open(resultsDirectory+"total.scores", "w") #Recreate the file
+ for agent in agents:
+ #totalFile.write(agent["name"] + " " + str(agent["totalScore"]) +"\n") #Write the total scores in descending order
+ #if verbose:
+ print "Agent: " + str(agent)
+
if verbose:
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(" Round " + str(roundNumber) + "
\n")
- agentFile.write(" Summary
\n")
+ agentFile.write(" Round Overview
\n")
agentFile.write("\n")
agentFile.write(" Score | Wins | Losses | Draws | Illegal | Errors |
\n")
- agentFile.write(" "+str(agent["score"][0])+" | "+str(len(agent["VICTORY"]))+" | "+str(len(agent["DEFEAT"]))+" | "+str(len(agent["DRAW"]))+" | "+str(len(agent["ILLEGAL"]))+" | " +str(len(agent["INTERNAL_ERROR"]))+" |
\n")
+ agentFile.write(" "+str(agent["score"][0])+" | "+str(len(agent["VICTORY"]) + len(agent["DEFAULT"]))+" | "+str(len(agent["DEFEAT"]) + len(agent["SURRENDER"]))+" | "+str(len(agent["DRAW"]) + len(agent["DRAW_DEFAULT"]))+" | "+str(len(agent["ILLEGAL"]) + len(agent["BOTH_ILLEGAL"]) + len(agent["BAD_SETUP"]))+" | " +str(len(agent["INTERNAL_ERROR"]))+" |
\n")
agentFile.write("
\n")
+ agentFile.write(" Round "+str(roundNumber) + " Scoreboard
\n")
agentFile.write(" Detailed
\n")
agentFile.write("\n")
agentFile.write(" Game ID | Opponent | Played as | Outcome | Score | Accumulated Score |
\n")
+
+
for index in range(0, len(agent["ALL"])):
- agentFile.write(" " + str(agent["ALL"][index][1]) + " | "+agent["ALL"][index][0] + " | " + agent["ALL"][index][4] + " | " + agent["ALL"][index][3] + " | " + str(agent["ALL"][index][2]) + " | " + str(agent["score"][len(agent["score"])-index -2]) + " |
\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(" " + str(agent["ALL"][index][1]) + " | "+agent["ALL"][index][0] + " | " + agent["ALL"][index][4] + " | " + agent["ALL"][index][3] + " | " + str(agent["ALL"][index][2]) + " | " + str(agent["score"][len(agent["score"])-index -2]) + " |
\n")
agentFile.write("
\n")
+
+ agent["totalScore"] += agent["score"][0]
+ agent["Wins"] += len(agent["VICTORY"]) + len(agent["DEFAULT"])
+ agent["Losses"] += len(agent["DEFEAT"]) + len(agent["SURRENDER"])
+ agent["Draws"] += len(agent["DRAW"]) + len(agent["DRAW_DEFAULT"])
+ agent["Illegal"] += len(agent["ILLEGAL"]) + len(agent["BOTH_ILLEGAL"]) + len(agent["BAD_SETUP"])
+ agent["Errors"] += len(agent["INTERNAL_ERROR"])
+
+ agentFile.write(" Accumulated Results
\n")
+ agentFile.write("\n")
+ agentFile.write(" Score | Wins | Losses | Draws | Illegal | Errors |
\n")
+ agentFile.write(" "+str(agent["totalScore"])+" | "+str(agent["Wins"])+" | "+str(agent["Losses"])+" | "+str(agent["Draws"])+" | "+str(agent["Illegal"])+" | " +str(agent["Errors"])+" |
\n")
+
+ agentFile.write("
\n")
+
+
agentFile.close()
+
+ #Update round file
+ roundFile = open(resultsDirectory + "round"+str(roundNumber)+".html", "w")
+ roundFile.write("\n\n Round " +str(roundNumber)+ " Overview \n\n\n")
+ roundFile.write(" Round " +str(roundNumber)+ " Overview
\n")
+ roundFile.write("\n")
+ roundFile.write(" Name | Score | Total Score |
\n")
+ agents.sort(key = lambda e : e["score"][0], reverse=True)
+ for agent in agents:
+ roundFile.write(" "+agent["name"] + " | " + str(agent["score"][0]) + " | " + str(agent["totalScore"]) + " |
\n")
+ roundFile.write("
\n")
+ roundFile.write(" Current Scoreboard
\n")
+ roundFile.write("\n\n\n\n")
+ roundFile.close()
+
+
+
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("\n\n