def record_ladder_match(world): # Now to generate tournament compatible scores # Collect the game_scores = {} alive = [] dead = [] ranks = {} ai_files = set() file_to_class_map = {} for ai in world.dumpScores(): ai_instance = world.team_map[ai["team"]] ai_class = ai_instance.__class__ ai_module = sys.modules[ai_class.__module__] ai_str = ai_module.__ai_str__ ai_files.add(ai_str) file_to_class_map[ai_str] = ai_class.__name__ # [okay]: TODO: actually use a better ranking system than tying for last. # Score should be: # If alive: # score: dead units + kills # If dead: # score: dead units + kills game_scores[ai_str] = ai["deaths"] + ai["kills"] if ai["units"] > 0: alive.append(ai_str) else: dead.append(ai_str) dead.sort(key=lambda u: game_scores[u], reverse=True) alive.sort(key=lambda u: game_scores[u], reverse=True) rank = 0 score = None for ai_str in alive: ai_score = game_scores[ai_str] if ai_score is not score: rank += 1 ranks[ai_str] = rank score = ai_score log.info("Alive: AI: %s, Score: %s, Rank: %s" % (ai_str, score, rank)) rank += 1 for ai_str in dead: ai_score = game_scores[ai_str] if ai_score is not score: rank += 1 ranks[ai_str] = rank score = ai_score log.info("Dead: AI: %s, Score: %s, Rank: %s" % (ai_str, score, rank)) ai_players = AILadderPlayer.get_by_key_name(ai_files) map_players = get_map_players(ai_files, file_to_class_map) adjust_rankings(ai_players, ai_files, ranks) adjust_rankings(map_players, ai_files, ranks)
def record_game_to_db(world, replay_blob_key, run_time, tournament_key=None): t = None if tournament_key: t = db.Key(tournament_key) gr = GameRun(replay=replay_blob_key, turns=world.currentTurn - 1, run_time=run_time, map_name=settings.MAP_NAME, version=code_signature.digestCode(), tournament=t) gr.put() winners = defaultdict(bool) for ai_datum in world.dumpScores(): if ai_datum['units'] > 0: winners[ai_datum['team']] = True if len(winners) > 1: winners = defaultdict(bool) for ai_datum in world.dumpScores(): team = ai_datum['team'] ai = world.team_map[team] mod = sys.modules[ai.__class__.__module__] md = hashlib.md5() md.update(mod.__file_content__) version = md.hexdigest() win = winners[team] aip = AIParticipant(class_name=ai.__class__.__name__, file_name=mod.__file__, version=version, win=win, kills=ai_datum['kills'], deaths=ai_datum['deaths'], units=ai_datum['units'], buildings=ai_datum['buildings'], game_run=gr) aip.put()
def record_game_to_db(world, replay_blob_key, run_time, tournament_key=None): t = None if tournament_key: t = db.Key(tournament_key) gr = GameRun(replay=replay_blob_key, turns=world.currentTurn-1, run_time=run_time, map_name=settings.MAP_NAME, version=code_signature.digestCode(), tournament=t) gr.put() winners = defaultdict(bool) for ai_datum in world.dumpScores(): if ai_datum['units'] > 0: winners[ai_datum['team']] = True if len(winners) > 1: winners = defaultdict(bool) for ai_datum in world.dumpScores(): team = ai_datum['team'] ai = world.team_map[team] mod = sys.modules[ai.__class__.__module__] md = hashlib.md5() md.update(mod.__file_content__) version = md.hexdigest() win = winners[team] aip = AIParticipant(class_name=ai.__class__.__name__, file_name=mod.__file__, version=version, win=win, kills=ai_datum['kills'], deaths=ai_datum['deaths'], units=ai_datum['units'], buildings=ai_datum['buildings'], game_run=gr) aip.put()
def mark_timed_out_ai(world): ai_files = set() file_to_class_map = {} for ai in world.dumpScores(): ai_instance = world.team_map[ai["team"]] ai_class = ai_instance.__class__ ai_module = sys.modules[ai_class.__module__] ai_str = ai_module.__ai_str__ ai_files.add(ai_str) file_to_class_map[ai_str] = ai_class.__name__ total_time = defaultdict(int) for turn in world.execution_times: for ai in world.execution_times[turn]: total_time[ai] += world.execution_times[turn][ai] ai = world.executing TEN_SECONDS = 10 if not total_time[ai] or total_time[ai] / float(total) > 0.80 or \ time.time() - world.execution_start_time > TEN_SECONDS: ai_instance = world.team_map[ai.team] ai_class = ai_instance.__class__ ai_module = sys.modules[ai_class.__module__] ai_str = ai_module.__ai_str__ log.info("deadlined %s, (prev time used: %ss, current chunk: %.2fs", ai_str, total_time[ai], time.time() - world.execution_start_time) ai_player = AILadderPlayer.get_by_key_name([ai_str])[0] if ai_player: ai_player.faults += 1 log.info("%s has been responsible for %s faults", ai_str, ai_player.faults) if ai_player.faults >= 10: log.info("disabling player") ai_player.enabled = False ai_player.put()
def mark_timed_out_ai(world): ai_files = set() file_to_class_map = {} for ai in world.dumpScores(): ai_instance = world.team_map[ai["team"]] ai_class = ai_instance.__class__ ai_module = sys.modules[ai_class.__module__] ai_str = ai_module.__ai_str__ ai_files.add(ai_str) file_to_class_map[ai_str] = ai_class.__name__ total_time = defaultdict(int) for turn in world.execution_times: for ai in world.execution_times[turn]: total_time[ai] += world.execution_times[turn][ai] ai = world.executing TEN_SECONDS=10 if not total_time[ai] or total_time[ai] / float(total) > 0.80 or \ time.time() - world.execution_start_time > TEN_SECONDS: ai_instance = world.team_map[ai.team] ai_class = ai_instance.__class__ ai_module = sys.modules[ai_class.__module__] ai_str = ai_module.__ai_str__ log.info("deadlined %s, (prev time used: %ss, current chunk: %.2fs", ai_str, total_time[ai], time.time() - world.execution_start_time) ai_player = AILadderPlayer.get_by_key_name([ai_str])[0] if ai_player: ai_player.faults += 1 log.info("%s has been responsible for %s faults", ai_str, ai_player.faults) if ai_player.faults >= 10: log.info("disabling player") ai_player.enabled = False ai_player.put()