Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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()
Exemplo n.º 4
0
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()
Exemplo n.º 5
0
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()
Exemplo n.º 6
0
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()