#!/usr/bin/env python import json import sys import glob from datetime import datetime solutionsDir = "solutions/" class bcolors: HEADER = '\033[95m' OKBLUE = '\033[94m' OKGREEN = '\033[92m' WARNING = '\033[93m' FAIL = '\033[91m' ENDC = '\033[0m' BOLD = '\033[1m' UNDERLINE = '\033[4m' if len(sys.argv) < 2 or sys.argv[1] != "status": results = json.loads(''.join(sys.stdin.readlines())) resultsScore = {} with open('scores') as f: for line in f: tmp = line.strip().split(' ') key = tmp[0]+"."+tmp[1] if not key in resultsScore: resultsScore[key] = int(tmp[2]) #else: # print "Score alredy present for " + tmp[0] + " " + tmp[1] f.close() if len(sys.argv) < 2 or sys.argv[1] != "status": strategy = "unknown" if len(sys.argv) < 2 else sys.argv[1] for i in range(0, len(results)): key = str(results[i]['problemId']) + "." + str(results[i]['seed']) if key in resultsScore: out_file = open(solutionsDir+str(results[i]['problemId'])+"."+str(results[i]['seed'])+"."+"%.110d"%resultsScore[key]+"."+strategy,"w") results[i]['tag'] = strategy out_file.write(json.dumps(results[i])) out_file.close() else: print "Missing score for " + str(results[i]['problemId']) + " " + str(results[i]['seed']) sys.exit(1) else: results=[{'problemId':''}] solutionsToSend=[] scores = {} lastProblem = "" for solution in sorted(glob.glob(solutionsDir + str(results[0]['problemId']) + '.*'), reverse=True): problemHash = solution[:solution.rfind(".", 0, solution.rfind(".")) if solution.count('.') == 3 else solution.rfind(".")] if lastProblem != problemHash: lastProblem = problemHash with open(solution) as json_data: partialSolution = json.load(json_data) json_data.close() solutionsToSend.append(partialSolution) scores[lastProblem.replace(solutionsDir, '')] = int(solution.split('.')[2]) if len(sys.argv) < 2 or sys.argv[1] != "status": print json.dumps(list(reversed(solutionsToSend))).replace(', ', ',').replace(': ', ':') else: import subprocess process = subprocess.Popen(['curl --user :2aaFCkjNIDHAsAIh9iQHc+Y+FGhkM5Z0RQgpO6TL6EA= -X GET https://davar.icfpcontest.org/teams/235/solutions'], shell = True, stdout=subprocess.PIPE) out, err = process.communicate() if err == None: serverResults = {} results = json.loads(out) for result in results: #2015-08-08T12:26:42.894Z date_object = datetime.strptime(result['createdAt'], '%Y-%m-%dT%H:%M:%S.%fZ') # print str(date_object) key = str(result['problemId'])+"."+str(result['seed']) if not key in serverResults or serverResults[key]['createdAt'] < result['createdAt']: serverResults[key] = result #print results tags = {} for serverResult in serverResults: if not serverResults[serverResult]['tag'] in tags: tags[serverResults[serverResult]['tag']] = 1 else: tags[serverResults[serverResult]['tag']] += 1 print "Submitted solution: %d"%len(solutionsToSend) for solutionToSend in solutionsToSend: key = str(solutionToSend['problemId'])+"."+str(solutionToSend['seed']) if not key in serverResults: print bcolors.FAIL + str(solutionToSend['problemId'])+" "+str(solutionToSend['seed']) + " not present on server" + bcolors.ENDC else: if solutionToSend['solution'] != serverResults[key]['solution']: print bcolors.FAIL + str(solutionToSend['problemId'])+" "+str(solutionToSend['seed']) + " solution differ: " + solutionToSend['solution'] + " != " + serverResults[key]['solution'] + " (server)" + bcolors.ENDC elif serverResults[key]['score'] == None: found = False for i in range(1, len(results) + 1): result = results[len(results)- i] if result['problemId'] == solutionToSend['problemId'] and result['seed'] == solutionToSend['seed'] and result['solution'] == solutionToSend['solution'] and scores[key] == result['score']: found = True print bcolors.WARNING + str(solutionToSend['problemId'])+" "+str(solutionToSend['seed']) + " " + bcolors.OKGREEN + "score " + str(result['score']) + " ok" + bcolors.ENDC + bcolors.WARNING + ", but solution evaluation pending" + bcolors.ENDC break if not found: print bcolors.WARNING + str(solutionToSend['problemId'])+" "+str(solutionToSend['seed']) + " solution evaluation pending" + bcolors.ENDC elif scores[key] != serverResults[key]['score']: print bcolors.FAIL + str(solutionToSend['problemId'])+" "+str(solutionToSend['seed']) + " score differ: " + str(scores[key]) + " != " + str(serverResults[key]['score']) + " (server)" + bcolors.ENDC print "Tags statistics:" for tag in tags: print " %s: %d"%(tag, tags[tag]) # print scores # print type(out) # print json.dumps(serverResults) # print len(serverResults) else: print "error retriving results from server" sys.exit(1) sys.exit(0)