Backing up the results files before fucking with them
[progcomp2012.git] / judge / simulator / simulate.py
index 634e424..a7a138d 100755 (executable)
@@ -10,6 +10,7 @@
 
        Now (sortof) generates .html files to display results in a prettiful manner.
        
 
        Now (sortof) generates .html files to display results in a prettiful manner.
        
+       THIS FILE IS TERRIBLE
 
  author Sam Moore (matches) [SZM]
  website http://matches.ucc.asn.au/stratego
 
  author Sam Moore (matches) [SZM]
  website http://matches.ucc.asn.au/stratego
@@ -50,7 +51,7 @@ if len(sys.argv) >= 5:
 
 
 #Score dictionary - Tuple is of the form: (end score, other score, other result) where end is the player on whose turn the result occurs, other is the other player, other result indicates what to record the outcome as for the other player.
 
 
 #Score dictionary - Tuple is of the form: (end score, other score, other result) where end is the player on whose turn the result occurs, other is the other player, other result indicates what to record the outcome as for the other player.
-scores = {"VICTORY":(3,1, "DEFEAT"), "DEFEAT":(1,3, "VICTORY"), "SURRENDER":(1,3, "VICTORY"), "DRAW":(2,2, "DRAW"), "DRAW_DEFAULT":(1,1, "DRAW_DEFAULT"), "ILLEGAL":(-1,2, "DEFAULT"), "DEFAULT":(2,-1, "ILLEGAL"), "BOTH_ILLEGAL":(-1,-1, "BOTH_ILLEGAL"), "INTERNAL_ERROR":(0,0, "INTERNAL_ERROR"), "BAD_SETUP":(0,0,"BAD_SETUP")}
+scores = {"VICTORY":(0.3,0.1, "DEFEAT"), "DEFEAT":(0.1,0.3, "VICTORY"), "SURRENDER":(0,0.3, "VICTORY"), "DRAW":(0.2,0.2, "DRAW"), "DRAW_DEFAULT":(0.1,0.1, "DRAW_DEFAULT"), "ILLEGAL":(-0.1,0.2, "DEFAULT"), "DEFAULT":(0.2,-0.1, "ILLEGAL"), "BOTH_ILLEGAL":(-0.1,-0.1, "BOTH_ILLEGAL"), "INTERNAL_ERROR":(0,0, "INTERNAL_ERROR"), "BAD_SETUP":(0,0,"BAD_SETUP")}
 
 
 #Verbose - print lots of useless stuff about what you are doing (kind of like matches talking on irc...)
 
 
 #Verbose - print lots of useless stuff about what you are doing (kind of like matches talking on irc...)
@@ -151,6 +152,29 @@ if verbose:
 if verbose:
        print "Preparing .html results files..."
 
 if verbose:
        print "Preparing .html results files..."
 
+#BACKUP THE RESULTS DIRECTORY GOD DAMMIT
+os.system("mkdir .before_round"+str(totalRounds)+"_BACKUP/; cp " + resultsDirectory+"*" + " .before_round"+str(totalRounds)+"_BACKUP/")
+
+
+if os.path.exists(resultsDirectory + "index.html") == True:
+       os.remove(resultsDirectory + "index.html") #Delete the file
+totalFile = open(resultsDirectory + "index.html", "w")
+totalFile.write("<html>\n<head>\n <title> Round in progress... </title>\n</head>\n<body>\n")
+if nRounds > 1:
+       totalFile.write("<h1> Rounds " + str(totalRounds) + " to " + str(totalRounds + nRounds-1) + " in progress...</h1>\n")
+else:
+       totalFile.write("<h1> Round " + str(totalRounds) + " in progress...</h1>\n")
+totalFile.write("<p> Please wait for the rounds to finish. You can view the current progress by watching the <a href = \"../log\"/>Log Files</a> </p>")
+if totalRounds > 1:
+       totalFile.write("<h2> Round Summaries </h2>\n")
+       totalFile.write("<table border=\"0\" cellpadding=\"10\">\n")
+       for i in range(1, totalRounds):
+               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()
+
 
 for agent in agents:
        if os.path.exists(resultsDirectory+agent["name"] + ".html") == False:
 
 for agent in agents:
        if os.path.exists(resultsDirectory+agent["name"] + ".html") == False:
@@ -173,19 +197,24 @@ for agent in agents:
        while line != "":
                #if verbose:
                #       print "Interpreting line \"" + line.strip() + "\""
        while line != "":
                #if verbose:
                #       print "Interpreting line \"" + line.strip() + "\""
-               if line.strip() == "</body>":
+               if line.strip() == "</body>" or line.strip() == "<!--end-->":
                        break
                        break
-               elif line == "<tr> <th> Score </th> <th> Wins </th> <th> Losses </th> <th> Draws </th> <th> Illegal </th> <th> Errors </th></tr>\n":
+               elif line == "<h3> Round Overview </h3>\n":
                        agentFile.write(line)
                        line = oldFile.readline()
                        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 line == "<tr> <th> Score </th> <th> Wins </th> <th> Losses </th> <th> Draws </th> <th> Illegal </th> <th> Errors </th></tr>\n":
+                               #sys.stdout.write("Adding scores... " + line + "\n")
+                               agentFile.write(line)
+                               line = oldFile.readline()
+                               values = line.split(' ')
+                               agent["totalScore"] += float(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()
 
                agentFile.write(line)
                line = oldFile.readline()
 
@@ -232,7 +261,9 @@ for roundNumber in range(totalRounds, totalRounds + nRounds):
                                logFile = logDirectory + "round"+str(roundNumber) + "/"+red["name"]+".vs."+blue["name"]+"."+str(gameID)
                                errorLog = [logDirectory + "error/" + red["name"] + "."+str(gameID), logDirectory + "error/" + blue["name"] + "."+str(gameID)]
                                #Run the game, outputting to logFile; stderr of (both) AI programs is directed to logFile.stderr
                                logFile = logDirectory + "round"+str(roundNumber) + "/"+red["name"]+".vs."+blue["name"]+"."+str(gameID)
                                errorLog = [logDirectory + "error/" + red["name"] + "."+str(gameID), logDirectory + "error/" + blue["name"] + "."+str(gameID)]
                                #Run the game, outputting to logFile; stderr of (both) AI programs is directed to logFile.stderr
-                               outline = os.popen(managerPath + " -o " + logFile + " -T " + str(timeoutValue) + " \"" + red["path"] + "\" \"" + blue["path"] + "\" 2>> " + logFile+".stderr", "r").read()
+                               outline = os.popen(managerPath + " -m 1000 -o " + logFile + " -T " + str(timeoutValue) + " \"" + red["path"] + "\" \"" + blue["path"] + "\" 2>> " + logFile+".stderr", "r").read()
+                               
+                               #os.system("mv tmp.mp4 " + logFile + ".mp4")
                                
                                #If there were no errors, get rid of the stderr file
                                if os.stat(logFile+".stderr").st_size <= 0:
                                
                                #If there were no errors, get rid of the stderr file
                                if os.stat(logFile+".stderr").st_size <= 0:
@@ -274,6 +305,13 @@ for roundNumber in range(totalRounds, totalRounds + nRounds):
                                                otherColour["score"].insert(0, otherColour["score"][0] + scores[results[2]][1])
                                                otherColour[scores[results[2]][2]].append((endColour["name"], gameID, scores[results[2]][1]))
                                                otherColour["ALL"].append((endColour["name"], gameID, scores[results[2]][1], scores[results[2]][2], otherStr))
                                                otherColour["score"].insert(0, otherColour["score"][0] + scores[results[2]][1])
                                                otherColour[scores[results[2]][2]].append((endColour["name"], gameID, scores[results[2]][1]))
                                                otherColour["ALL"].append((endColour["name"], gameID, scores[results[2]][1], scores[results[2]][2], otherStr))
+                                               #Write scores to raw text files
+                                               for agent in [endColour, otherColour]:
+                                                       scoreFile = open(resultsDirectory + agent["name"] + ".scores", "a")
+                                                       scoreFile.write(str(agent["totalScore"] + agent["score"][0]) + "\n")
+                                                       scoreFile.close()
+                                               
+                                               
 
                                        
                                        if verbose:
 
                                        
                                        if verbose:
@@ -345,6 +383,9 @@ for roundNumber in range(totalRounds, totalRounds + nRounds):
                agentFile.write("</table>\n")
 
 
                agentFile.write("</table>\n")
 
 
+               
+
+
                agentFile.close()       
 
        #Update round file
                agentFile.close()       
 
        #Update round file
@@ -357,7 +398,31 @@ for roundNumber in range(totalRounds, totalRounds + nRounds):
        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")
        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")
-       roundFile.write("<p> <a href=total.html>Current Scoreboard</a></p>\n")
+
+       command = "cp scores.plt " + resultsDirectory + "scores.plt;"
+       os.system(command)
+
+       scorePlot = open(resultsDirectory + "scores.plt", "a")
+       scorePlot.write("plot ")
+       for i in range(0, len(agents)):
+               if i > 0:
+                       scorePlot.write(", ")
+               scorePlot.write("\""+agents[i]["name"]+".scores\" using ($0+1):1 with linespoints title \""+agents[i]["name"]+"\"")
+
+       scorePlot.write("\nexit\n")
+       scorePlot.close()
+
+       command = "d=$(pwd); cd " + resultsDirectory + ";"
+       command += "gnuplot scores.plt;"
+       command += "rm -f scores.plt;"
+       command += "mv scores.png round"+str(roundNumber)+".png;"
+       command += "cd $d;"
+       os.system(command)
+
+       roundFile.write("<h2> Accumulated Scores - up to Round " + str(roundNumber)+" </h2>\n")
+       roundFile.write("<img src=\"round"+str(roundNumber)+".png\" alt = \"round"+str(roundNumber)+".png\" title = \"round"+str(roundNumber)+".png\" width = \"640\" height = \"480\"/>\n")
+
+       roundFile.write("<p> <a href=index.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()
 
        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()
 
@@ -369,16 +434,32 @@ if verbose:
        print "Finalising .html files... "
 for agent in agents:
        agentFile = open(resultsDirectory + agent["name"]+".html", "a")
        print "Finalising .html files... "
 for agent in agents:
        agentFile = open(resultsDirectory + agent["name"]+".html", "a")
-
-       #Write the "total" statistics
+       agentFile.write("<!--end-->\n")
+       #Write a graph
+       #Comment out if you don't have gnuplot
+
+       command  = "rm -f " + agent["name"] + ".png;"
+       command += "cp template.plt " + resultsDirectory + agent["name"] + ".plt;"
+       command += "d=$(pwd); cd " + resultsDirectory + ";"
+       command += "sed -i \"s:\[NAME\]:"+agent["name"]+":g\" " +resultsDirectory + agent["name"]+".plt;"
+       command += "gnuplot " + resultsDirectory + agent["name"]+".plt;"
+       command += "rm -f " + resultsDirectory + agent["name"] + ".plt;"
+       command += "cd $d;"
+       os.system(command)
+       agentFile.write("<!--end-->\n")
+       agentFile.write("<h3> Score Graph </h3>\n")
+       agentFile.write("<img src=\""+agent["name"]+".png\" alt=\""+agent["name"]+".png\" title=\""+agent["name"]+".png\" width=\"640\" height=\"480\"/>\n")
+
+       #Link to main file
+       agentFile.write("<p> <a href=\"index.html\"/>Total Statistics</a> </p>\n")
 
        agentFile.write("</body>\n<!-- Results file for \"" + agent["name"] + "\" autogenerated by \"" + sys.argv[0] + "\" at time " + str(time()) + " -->\n</html>\n\n")
        agentFile.close()
 
 
        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(resultsDirectory + "total.html") == True:
-               os.remove(resultsDirectory + "total.html") #Delete the file
+if os.path.exists(resultsDirectory + "index.html") == True:
+       os.remove(resultsDirectory + "index.html") #Delete the file
 
 
-totalFile = open(resultsDirectory + "total.html", "w")
+totalFile = open(resultsDirectory + "index.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")
 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")
@@ -388,6 +469,19 @@ 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")
 
        totalFile.write("<tr> <td> <a href="+agent["name"]+".html>"+agent["name"] + " </a> </td> <td> " + str(agent["totalScore"]) + " </td> </tr>\n")
 totalFile.write("</table>\n")
 
+totalFile.write("<h2> Score Graph </h2>\n")
+
+
+command = "d=$(pwd);"
+command += "cd " + resultsDirectory + ";"
+command += "rm -f scores.png;"
+command += "cp round"+str(roundNumber)+".png scores.png;"
+command += "cd $d;"
+os.system(command)
+
+totalFile.write("<img src=\"scores.png\" alt=\"scores.png\" title=\"scores.png\" width=\"640\" height=\"480\"/>\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("<h2> Round Summaries </h2>\n")
 totalFile.write("<table border=\"0\" cellpadding=\"10\">\n")
 for i in range(1, totalRounds+1):
@@ -397,6 +491,11 @@ 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()
 
 totalFile.write("</body>\n<!-- Total Results file autogenerated by \"" + sys.argv[0] + "\" at time " + str(time()) + " -->\n</html>\n\n")
 totalFile.close()
 
+#Write results to a raw text file as well
+textResults = open(resultsDirectory + "total.txt", "w")
+for agent in agents:
+       textResults.write(agent["name"] + " " + str(agent["totalScore"]) + "\n")
+textResults.close()
        
 if verbose:
        print "Done!"
        
 if verbose:
        print "Done!"

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