X-Git-Url: https://git.ucc.asn.au/?p=progcomp2012.git;a=blobdiff_plain;f=progcomp%2Fjudge%2Fsimulator%2Fsimulate.py;h=5ad64485a46f91ea9a8816840f47c4c7fb9e21ba;hp=8937a2b9fbb8c1fbba1a602ac7060341bd293a62;hb=e1a5a224763b1374c8dff6dcc2f5d85c15335eae;hpb=baf69b8ddea3e2749f114a1e82bc1253ef062bc0 diff --git a/progcomp/judge/simulator/simulate.py b/progcomp/judge/simulator/simulate.py index 8937a2b..5ad6448 100755 --- a/progcomp/judge/simulator/simulate.py +++ b/progcomp/judge/simulator/simulate.py @@ -7,6 +7,8 @@ Plays exactly ONE round, but does not overwrite previously played rounds eg: run once to generate round1.results, twice to generate round2.results etc Also generates total.scores based on results from every round. + + Now (sortof) generates .html files to display results in a prettiful manner. author Sam Moore (matches) [SZM] @@ -19,30 +21,48 @@ import os import sys from time import time -baseDirectory = "/home/sam/Documents/progcomp2012/progcomp/" -resultsDirectory = baseDirectory+"results/" #Where results will go (results are in the form of text files of agent names and scores) -agentsDirectory = baseDirectory+"agents/" #Where agents are found (each agent has its own directory) -logDirectory = baseDirectory+"log/" #Where log files go -nGames = 10 #Number of games played by each agent against each opponent. Half will be played as RED, half as BLUE -managerPath = baseDirectory+"judge/manager/stratego" #Path to the manager program +#Global variables/arguments +baseDirectory = "../.." #Base directory for results, logs, agents +nGames = 2 #Number of games played by each agent against each opponent. Half will be played as RED, half as BLUE. If nGames <= 1, then no games will be played (useful for dry run?) nRounds = 1 -time() - -if len(sys.argv) == 2: +if len(sys.argv) >= 2: nRounds = int(sys.argv[1]) -elif len(sys.argv) != 1: - print "Useage: simulate.py [nRounds]" +if len(sys.argv) >= 3: + nGames = int(sys.argv[2]) + if nGames % 2 != 0: + print "Warning: nGames should be even. "+str(nGames)+" specified, but only " + str(int(nGames/2) * 2)+" will be played!" +if len(sys.argv) >= 4: + baseDirectory = sys.argv[3] +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) +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: + managerPath = sys.argv[5] + -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), "BAD_SETUP":(0,0)} #Score dictionary +#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")} + +#Verbose - print lots of useless stuff about what you are doing (kind of like matches talking on irc...) verbose = True + +#Check the manager program exists TODO: And is executable! +if os.path.exists(managerPath) == False: + print "Manager program at \""+managerPath+"\" doesn't exist!" + sys.exit(1) + #Make necessary directories + 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 @@ -53,97 +73,149 @@ if totalRounds > 1: if os.path.exists(logDirectory) == False: os.mkdir(logDirectory) #Make the log directory if it didn't exist -startTime = time() - -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 +startTime = time() #Record time at which simulation starts +if verbose: + if nRounds > 1: + print "Simulating " + str(nRounds) + " rounds (" + str(totalRounds) + " to " + str(totalRounds + nRounds-1) + ")" + else: + print "Simulating one round." + print "" + 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: if verbose: - print "Simulating ROUND " +str(roundNumber) - print "Identifying possible agents in \""+agentsDirectory+"\"" - - #Get all agent names from agentsDirectory - agentNames = os.listdir(agentsDirectory) - agents = [] - for name in agentNames: - #sys.stdout.write("\nLooking at Agent: \""+ str(name)+"\"... ") + sys.stdout.write("Scan \""+name+"\"... ") + if os.path.isdir(agentsDirectory+name) == False: #Remove non-directories if verbose: - sys.stdout.write("Scan \""+name+"\"... ") - if os.path.isdir(agentsDirectory+name) == False: #Remove non-directories - if verbose: - sys.stdout.write(" Invalid! (Not a directory)\n") - continue + 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 - if verbose: - sys.stdout.write(" Invalid! (No \"info\" file found)\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 + if verbose: + sys.stdout.write(" Invalid! (No \"info\" file found)\n") + continue + agentExecutable = agentsDirectory+name+"/"+(open(agentsDirectory+name+"/info").readline().strip()) + if os.path.exists(agentExecutable) == False: + if verbose: + sys.stdout.write(" Invalid! (Path: \""+agentExecutable+"\" does not exist!)\n") + continue + + + if verbose: + sys.stdout.write(" Valid! (Path: \""+agentExecutable+"\")\n") + + #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":[]}) + +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 "" + +#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) + +for agent in agents: + if os.path.exists(htmlDir+agent["name"] + ".html") == False: + agentFile = open(htmlDir+agent["name"] + ".html", "w") + agentFile.write("\n
\n