Modified manager output/protocol, added "basic" AI, made Asmodeus better
[progcomp2012.git] / simulator / simulate.py
index 5531143..60320d9 100755 (executable)
@@ -26,9 +26,9 @@ nGames = 10 #Number of games played by each agent against each opponent. Half wi
 managerPath = baseDirectory+"manager/stratego" #Path to the manager program
 
 
-scores = {"WIN":3, "DRAW":2, "LOSS":1, "NONE":0} #Score dictionary
-#NONE occurs if both programs crash. If only one program crashes the result is reported as a win-loss
+scores = {"VICTORY":(3,1), "DEFEAT":(1,3), "SURRENDER":(0,3), "DRAW":(2,2), "DRAW_DEFAULT":(1,1), "ILLEGAL":(-1,2), "DEFAULT":(2,-1), "BOTH_ILLEGAL":(-1,-1), "INTERNAL_ERROR":(0,0)} #Score dictionary
 
+verbose = True
 
 
 #Make necessary directories
@@ -55,15 +55,19 @@ agentNames = os.listdir(agentsDirectory)
 agents = []
 for name in agentNames:
        #sys.stdout.write("\nLooking at Agent: \""+ str(name)+"\"... ")
-       sys.stdout.write("Scan \""+name+"\"... ")
+       if verbose:
+               sys.stdout.write("Scan \""+name+"\"... ")
        if os.path.isdir(agentsDirectory+name) == False: #Remove non-directories
-               sys.stdout.write(" Invalid! (Not a directory)\n")
+               if verbose:
+                       sys.stdout.write(" Invalid! (Not a directory)\n")
                continue
 
        if os.path.exists(agentsDirectory+name+"/info") == False: #Try and find the special "info" file in each directory; ignore if it doesn't exist
-               sys.stdout.write(" Invalid! (No \"info\" file found)\n")
+               if verbose:
+                       sys.stdout.write(" Invalid! (No \"info\" file found)\n")
                continue
-       sys.stdout.write(" Valid!")
+       if verbose:
+               sys.stdout.write(" Valid!")
        #sys.stdout.write("OK")
        #Convert the array of names to an array of triples
        #agents[0] - The name of the agent (its directory)
@@ -71,19 +75,17 @@ for name in agentNames:
        #agents[2] - The score the agent achieved in _this_ round. Begins at zero
        agentExecutable = agentsDirectory+name+"/"+(open(agentsDirectory+name+"/info").readline().strip())
        agents.append([name, agentExecutable, 0])
-       sys.stdout.write(" (Run program \""+agentExecutable+"\")\n")
+       if verbose:
+               sys.stdout.write(" (Run program \""+agentExecutable+"\")\n")
 
 if len(agents) == 0:
        print "Couldn't find any agents! Check paths (Edit this script) or generate \"info\" files for agents."
        sys.exit(0)
+if verbose:
+       print "Total: " + str(len(agents)) + " valid agents found (From "+str(len(agentNames))+" possibilities)"
+       print ""
+       print "Commencing ROUND " + str(roundNumber) + " combat! ("+str(nGames)+" games per pairing)"
 
-print "Total: " + str(len(agents)) + " valid agents found (From "+str(len(agentNames))+" possibilities)"
-
-print ""
-
-print "Commencing ROUND " + str(roundNumber) + " combat! ("+str(nGames)+" games per pairing)"
-print "Points values are: "+str(scores)
-print ""
 
 normalGames = 0
 draws = 0
@@ -96,45 +98,47 @@ for red in agents:  #for each agent playing as red,
                        continue #Exclude battles against self
                for i in range(1, nGames/2 + 1):
                        #Play a game and read the result. Note the game is logged to a file based on the agent's names
-                       sys.stdout.write("Agents: \""+red[0]+"\" and \""+blue[0]+"\" playing game " + str(i) + "/"+str(nGames/2) + "... ")
+                       if verbose:
+                               sys.stdout.write("Agents: \""+red[0]+"\" and \""+blue[0]+"\" playing game " + str(i) + "/"+str(nGames/2) + "... ")
                        logFile = logDirectory + "round"+str(roundNumber) + "/"+red[0]+"_vs_"+blue[0]+"_"+str(i)
                        outline = os.popen(managerPath + " -o " + logFile + " " + red[1] + " " + blue[1], "r").read()
                        results = outline.split(' ')
-                       #Look at who won, and adjust scores based on that
-                       if results[0] == "NONE":
-                               red[2] += scores["NONE"]
-                               blue[2] += scores["NONE"]
-                               sys.stdout.write(" No contest. (Check AI for errors).\n")
-                               aiErrors += 1
-                       elif results[0] == "DRAW":
-                               red[2] += scores["DRAW"]
-                               blue[2] += scores["DRAW"]
-                               sys.stdout.write(" Draw.\n")
-                               draws += 1
-                       elif results[0] == red[1]:
-                               red[2] += scores["WIN"]
-                               blue[2] += scores["LOSS"]
-                               sys.stdout.write(" \""+red[0]+"\"\n")
-                               normalGames += 1
-                       elif results[0] == blue[1]:
-                               red[2] += scores["LOSS"]
-                               blue[2] += scores["WIN"]
-                               sys.stdout.write(" \""+blue[0]+"\"\n")
-                               normalGames += 1
+                       
+                       if len(results) != 6:
+                               if verbose:
+                                       sys.stdout.write("Garbage output!       " + outline)
                        else:
-                               sys.stdout.write(" Garbage output! \""+outline+"\" (log file \""+logFile+"\")\n")
-                               managerErrors += 1
-               
+                               if results[1] == "RED":
+                                       red[2] += scores[results[2]][0]
+                                       blue[2] += scores[results[2]][1]
+                               elif results[1] == "BLUE":
+                                       red[2] += scores[results[2]][1]
+                                       blue[2] += scores[results[2]][0]
+                               elif results[1] == "BOTH":
+                                       red[2] += scores[results[2]][0]
+                                       blue[2] += scores[results[2]][1]
+                                       red[2] += scores[results[2]][1]
+                                       blue[2] += scores[results[2]][0]
+
+                       if verbose:
+                               sys.stdout.write("      " + outline)
+                               
+                               
+                               
+                               
 
-print "Completed combat. Total of " + str(normalGames + draws + aiErrors + managerErrors) + " games played. "
+               
+if verbose:
+       print "Completed combat. Total of " + str(normalGames + draws + aiErrors + managerErrors) + " games played. "
 if managerErrors != 0:
-       print " WARNING: Recieved "+str(managerErrors)+" garbage outputs. Check the manager program."
+       print "WARNING: Recieved "+str(managerErrors)+" garbage outputs. Check the manager program."
 
-print "" 
+if verbose:
+       print "" 
 #We should now have complete score values.
                
-
-sys.stdout.write("Creating results files for ROUND " + str(roundNumber) + "... ")
+if verbose:
+       sys.stdout.write("Creating results files for ROUND " + str(roundNumber) + "... ")
 
 agents.sort(key = lambda e : e[2], reverse=True) #Sort the agents based on score
 
@@ -142,13 +146,14 @@ resultsFile = open(resultsDirectory+"round"+str(roundNumber)+".results", "w") #C
 for agent in agents:
        resultsFile.write(agent[0] + " " + str(agent[2]) +"\n") #Write the agent names and scores into the file, in descending order
 
-sys.stdout.write(" Complete!\n")
-
-sys.stdout.write("Updating total scores... ");
+if verbose:
+       sys.stdout.write(" Complete!\n")
+       sys.stdout.write("Updating total scores... ");
 
 #Now update the total scores
 if os.path.exists(resultsDirectory+"total.scores"):
-       sys.stdout.write(" Reading from \""+resultsDirectory+"total.scores\" to update scores... ")
+       if verbose:
+               sys.stdout.write(" Reading from \""+resultsDirectory+"total.scores\" to update scores... ")
        totalFile = open(resultsDirectory+"total.scores", "r") #Try to open the total.scores file
        for line in totalFile: #For all entries, 
                data = line.split(' ')
@@ -163,11 +168,13 @@ if os.path.exists(resultsDirectory+"total.scores"):
        agents.sort(key = lambda e : e[2], reverse=True)
 
 else:
-       sys.stdout.write(" First round - creating \""+resultsDirectory+"total.scores\"... ")
-sys.stdout.write(" Complete!\n")
+       if verbose:
+               sys.stdout.write(" First round - creating \""+resultsDirectory+"total.scores\"... ")
+if verbose:
+       sys.stdout.write(" Complete!\n")
+       print "Finished writing results for ROUND " + str(roundNumber)
+       print ""
 
-print "Finished writing results for ROUND " + str(roundNumber)
-print ""
 
 print "RESULTS FOR ROUND " + str(roundNumber)
 print "Agent: [name, path, total_score, recent_score]"

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