from datasets import load_dataset, Dataset import os from datasets import load_dataset from datasets.utils.logging import disable_progress_bar from constants import column_names, all_task_types from utils_display import make_clickable_model import random import json disable_progress_bar() id_to_data = None model_len_info = None def estimated_win_rate(elo_a, elo_b): """ Calculate the estimated win rate for player A against player B using their Elo ratings. :param elo_a: Elo rating of player A :param elo_b: Elo rating of player B :return: Estimated win rate for player A """ exponent = (elo_b - elo_a) / 400 probability_a_wins = 1 / (1 + 10 ** exponent) return (1-probability_a_wins)*100 # Formats the columns def formatter(x): if type(x) is str: x = x else: x = round(x, 2) return x def add_winrates(current_df): df = current_df.copy() elo_column = "Overall Elo" # Correct way to filter the DataFrame and get the Elo rating for "gpt-4-0125-preview" model_a_elo = df[df["Model"].str.contains("gpt-4")][elo_column].iloc[0] # Correct way to filter the DataFrame and get the Elo rating for "gpt-3.5-turbo-0125" model_b_elo = df[df["Model"].str.contains("gpt-3.5")][elo_column].iloc[0] # Calculate the win rate of "gpt-4-0125-preview" against all models df['Win% vs GPT-4'] = df[elo_column].apply(lambda x: estimated_win_rate(model_a_elo, x)).apply(formatter) df['Win% vs GPT-3.5T'] = df[elo_column].apply(lambda x: estimated_win_rate(model_b_elo, x)).apply(formatter) # apply the formatter for the two new columns cols = list(df.columns) cols.remove("# battles"); cols.append("# battles") cols.remove("Length"); cols.append("Length") df = df[cols] return df def add_winrates_tasks(current_df, ref="gpt-4"): new_df = current_df.copy() for t in all_task_types: column = column_names[t] model_a_elo = current_df[current_df["Model"].str.contains(ref)][column].iloc[0] new_df[column] = current_df[column].apply(lambda x: estimated_win_rate(model_a_elo, x)).apply(formatter) return new_df def post_processing(df, model_len_info): if model_len_info: df["Length"] = df["model name "].apply(lambda x: model_len_info[x]) for col in df.columns: if col == "model name ": df[col] = df[col].apply(lambda x: x.replace(x, make_clickable_model(x))) else: df[col] = df[col].apply(formatter) # For numerical values df.rename(columns=column_names, inplace=True) df.sort_values(by="Overall Elo", inplace=True, ascending=False) # put the "Overall Elo" and "Task-Avg Elo" column to the front # add the length info df = df[["Model", "Overall Elo", "Task-Avg Elo"] + [col for col in df.columns if col not in ["Model", "Overall Elo", "Task-Avg Elo"]]] return df def apply_length_penalty(original_df, ablation_df, length_penalty=0.2): original_df = original_df.copy() ablation_df = ablation_df.copy() # replace all values in original_df with the values as z = x - y * length_penalty where y is from ablation_df at the same row and column # except for the "Model" column and the "# battles" column # do not assume the order of the rows are the same in both dataframes for i, row in original_df.iterrows(): for col in original_df.columns: if col == "Model" or col == "# battles" or col == "Length": continue # assert that the model names are the same in both dataframes assert original_df.at[i, "Model"] == ablation_df[ablation_df["Model"] == row["Model"]]["Model"].values[0] original_df[col] = original_df[col].astype(float) original_df.at[i, col] = original_df.at[i, col] - ablation_df[ablation_df["Model"] == row["Model"]][col].values[0] * length_penalty # post_processing original_df = post_processing(original_df, model_len_info=None) return original_df def load_benchdata_dict(): with open("data_dir/predictions_logs.jsonl", "r") as f: bench_data = [json.loads(d) for d in f] id_to_data = {} for item in bench_data: id_to_data[item["idx"]] = item return id_to_data def load_eval_results(): with open("data_dir/predictions_logs.jsonl", "r") as f: eval_results = [json.loads(d) for d in f] return eval_results def sample_an_eval_result(eval_results, model_list=[]): global id_to_data eval_results = list(eval_results) random.shuffle(eval_results) for eval_item in eval_results: print(eval_item.keys()) model = eval_item['model'] task_type = eval_item['task_type'] # primary task type if model not in model_list: continue plan_history = eval_item['plan_prompts'] ground_history = eval_item['ground_prompts'] task = eval_item['question'] if "image" in eval_item: result_dict = { "session_id": eval_item['idx'], "task": task, "task_type": task_type, "plan_history": plan_history, "ground_history": ground_history, "pred": eval_item['pred'], "answer": eval_item['answer'], "correctness": eval_item['correctness'], "image": eval_item['image'].replace("eval/aokvqa/images/val2017/", "file/data_dir/test_images/") } else: result_dict = { "session_id": eval_item['idx'], "task": task, "task_type": task_type, "plan_history": plan_history, "ground_history": ground_history, "pred": eval_item['pred'], "answer": eval_item['answer'], "correctness": eval_item['correctness'], "image": None } break return result_dict id_to_data = load_benchdata_dict()