Fixing simulate.py
authorSam Moore <matches@ucc.asn.au>
Wed, 21 Dec 2011 08:37:01 +0000 (16:37 +0800)
committerSam Moore <matches@ucc.asn.au>
Wed, 21 Dec 2011 08:37:01 +0000 (16:37 +0800)
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.

progcomp/agents/asmodeus/info
progcomp/agents/basic_cpp/info
progcomp/agents/basic_python/info
progcomp/agents/vixen/info
progcomp/judge/simulator/Makefile
progcomp/judge/simulator/simulate.py

index da91d83..62e9c51 100644 (file)
@@ -1 +1,4 @@
 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.
index ee1b502..dd61e4a 100644 (file)
@@ -1 +1,4 @@
 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.
index 9260726..93fbaa2 100644 (file)
@@ -1 +1,4 @@
 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.
index 424358b..56945f6 100644 (file)
@@ -1 +1,4 @@
 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.
index 4237516..6296c3a 100644 (file)
@@ -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)
+
index 9b79194..aead755 100755 (executable)
@@ -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()
 
        

UCC git Repository :: git.ucc.asn.au