def short_pass_inner_function(log, n_steps=60): filtered_log = data.filter_log( log, type=( "SHORT_PASS_ATTEMPT", "NEW_POSSESSION", "OPP_POSSESSION", "KICK_RELEASE", "GOAL_SCORED", ), ) df = data.parse_log_to_df(filtered_log) if len(df): if "player" not in df.columns: df["player"] = -1 df["target"] = ( (df.type == "SHORT_PASS_ATTEMPT") & ( (df.type.shift(-1).isin(["NEW_POSSESSION", "KICK_RELEASE"])) | (df.type.shift(-1) == "GOAL_SCORED") | ((df.type.shift(-1) == "OPP_POSSESSION") & (df.player.shift(-1) == 0)) ) & (df.step.shift(-1) - df.step <= n_steps) ).astype(int) df = df[df.type == "SHORT_PASS_ATTEMPT"] return df
def position_score_inner_function(log): filtered_log = data.filter_log( log, type=("ACTIVE_POS_SCORE", "GOAL_SCORED", "OPP_POSSESSION"), ) df = data.parse_log_to_df(filtered_log) if len(df): df["reward"] = 0 goal_steps = df.step[df.type == "GOAL_SCORED"] for step in goal_steps: mask = (df.step < step) & (df.step >= (step - 20)) df.loc[mask, "reward"] = 1.0 opp_pos_steps = df.step[df.type == "OPP_POSSESSION"] for step in opp_pos_steps: mask = (df.step < step) & (df.step >= (step - 10)) df.loc[mask, "reward"] = -0.025 df = df[df.type == "ACTIVE_POS_SCORE"] return df
def handle_inner_function(log, n_steps=10): filtered_log = data.filter_log( log, type=( "MOVE_WITH_BALL_ATTEMPT", "LOST_POSSESSION", "NEW_POSSESSION", "OPP_POSSESSION", "SHOT_ATTEMPT", ), ) df = data.parse_log_to_df(filtered_log) if len(df): df["target"] = 1 bad_steps = df.step[df.type.isin(("LOST_POSSESSION", "OPP_POSSESSION"))] for step in bad_steps: mask = (df.step < step) & (df.step >= (step - n_steps)) df.loc[mask, "target"] = 0 # failed if lost possession df = df[df.type == "MOVE_WITH_BALL_ATTEMPT"] return df
def simulate_one_game(game_num): agent_obj = agent.Agent(noise_sd=NOISE_SD) def action(obs): return agent_obj.action_wrapper(obs) env = make( environment="football", configuration={ "save_video": False, "scenario_name": "11_vs_11_kaggle", "agentTimeout": 60, "actTimeout": 60, "runTimeout": 1200, }, ) env.reset() env.run([action, "cicada/simple_rules_based_agent.py"]) log_types_to_keep = [ "SHOT_ATTEMPT", "GOAL_SCORED", "OPP_GOAL_SCORED", "MOVE_WITH_BALL_ATTEMPT", "SHORT_PASS_ATTEMPT", "LONG_PASS_ATTEMPT", "LOST_POSSESSION", "NEW_POSSESSION", "OPP_POSSESSION", "ACTIVE_POS_SCORE", "KICK_WITH_NO_ATTEMPT_EVENT", "KICK_RELEASE", ] filtered_log = data.filter_log(agent_obj.state.log, type=log_types_to_keep) data.add_to_log_file(filtered_log) record_type_counts = data.count_record_types(filtered_log) score = env.state[0]["observation"]["players_raw"][0]["score"] data.add_to_score_file(score) to_print = f"game_num: {str(game_num):>4}, score: {str(score):>8}, steps: {str(len(env.steps)):>4}, " rec_count_strings = list() for rec_type, short_name in [ ("SHOT_ATTEMPT", "shot"), ("MOVE_WITH_BALL_ATTEMPT", "move"), ("SHORT_PASS_ATTEMPT", "short"), ("LONG_PASS_ATTEMPT", "long"), ("ACTIVE_POS_SCORE", "poss"), ]: rec_count_strings.append( f"{short_name}: {str(record_type_counts.get(rec_type, 0)):>4}" ) to_print += ", ".join(rec_count_strings) print(to_print)
def save_score_and_log(agent_obj, score): log_types_to_keep = [ "SHOT_ATTEMPT", "GOAL_SCORED", "OPP_GOAL_SCORED", "MOVE_WITH_BALL_ATTEMPT", "SHORT_PASS_ATTEMPT", "LONG_PASS_ATTEMPT", "LOST_POSSESSION", "NEW_POSSESSION", "OPP_POSSESSION", "ACTIVE_POS_SCORE", "KICK_WITH_NO_ATTEMPT_EVENT", "KICK_RELEASE", ] filtered_log = data.filter_log(agent_obj.state.log, type=log_types_to_keep) data.add_to_log_file(filtered_log) data.add_to_score_file(score)
def shot_inner_function(log, n_steps=30): filtered_log = data.filter_log( log, type=("SHOT_ATTEMPT", "GOAL_SCORED"), ) df = data.parse_log_to_df(filtered_log) if len(df): df["target"] = ( (df.type == "SHOT_ATTEMPT") & (df.type.shift(-1) == "GOAL_SCORED") & (df.step.shift(-1) - df.step <= n_steps) ).astype(int) df = df[df.type == "SHOT_ATTEMPT"] if "eval_data.dist_to_goalie" in df.columns: df = df[df["eval_data.dist_to_goalie"].isna()] if "eval_data.pos" in df.columns: df["posx"] = df["eval_data.pos"].str[0] df["posy"] = df["eval_data.pos"].str[1] return df