| import os |
| import argparse |
|
|
| import pandas as pd |
| import re |
| from datasets import load_dataset |
|
|
| import json |
|
|
|
|
| def extract_boxed_text_sampling(document): |
| solution = str(document) |
|
|
| |
| |
| |
| strict_prediction = None |
| prediction_match = re.search(r"\\boxed\{([^}]*)\}", solution) |
|
|
| if prediction_match: |
| content = prediction_match.group(1) |
| choice_match = re.search(r'\b([ABCD])\b', content) |
| if choice_match: |
| strict_prediction = choice_match.group(1) |
|
|
| |
| |
| |
| flexible_prediction = None |
|
|
| |
| if strict_prediction is None: |
| patterns = [ |
| r"(?i)Answer[ \t]*:[ \t]*([A-D])", |
| r"(?i)Answer is[ \t]*:?[ \t]*([A-D])", |
| r"(?i)is option[ \t]*:?[ \t]*([A-D])", |
| r"(?i)\*\*Answer:\*\*[ \t]*([A-D])", |
| r"(?i)Option ([A-D])", |
| ] |
| for pattern in patterns: |
| prediction_match = re.search(pattern, solution) |
| if prediction_match: |
| flexible_prediction = prediction_match.group(1) |
| break |
|
|
| |
| if strict_prediction is not None: |
| flexible_prediction = strict_prediction |
|
|
| return strict_prediction, flexible_prediction |
|
|
|
|
| def extract_boxed_text(document, expected_answer): |
| solution = document |
| correct = False |
|
|
| |
| prediction_match = re.search(r"\\boxed\{([^}]*)\}", str(solution)) |
|
|
| |
| prediction = None |
| if prediction_match: |
| content = prediction_match.group(1) |
| |
| choice_match = re.search(r'\b([ABCD])\b', content) |
| if choice_match: |
| prediction = choice_match.group(1) |
| |
| |
| |
| if prediction is None: |
| patterns = [ |
| r"(?i)Answer[ \t]*:[ \t]*([A-D])", |
| r"(?i)Answer is[ \t]*:?[ \t]*([A-D])", |
| r"(?i)is option[ \t]*:?[ \t]*([A-D])", |
| r"(?i)\*\*Answer:\*\*[ \t]*([A-D])", |
| r"(?i)Option ([A-D])", |
| ] |
| for pattern in patterns: |
| prediction_match = re.search(pattern, str(solution)) |
| if prediction_match: |
| prediction = prediction_match.group(1) |
| break |
| |
| |
| |
| if prediction is not None: |
| try: |
| if prediction.lower() == "ABCD"[expected_answer].lower(): |
| correct = True |
| except ValueError: |
| pass |
| |
| |
| return correct |
| def time_evaluation(result_file): |
| results = [] |
| f = open(result_file, 'r') |
| for line in f: |
| results.append(json.loads(line)) |
| f.close() |
|
|
| total_time, total_token = 0, 0 |
| total = 0 |
|
|
| total_steps = 0 |
| |
| for idx, problem in enumerate(results): |
| total += 1 |
| total_time += problem['time'] |
| total_token += problem['tokens'] |
| total_steps += problem.get('steps', 0) |
| |
| return { |
| 'total': total, |
| 'total_time': total_time, |
| 'total_token': total_token, |
| 'token/s': total_token / total_time, |
| 'avg_steps': total_steps / total if total > 0 else 0, |
| } |
|
|
| def evaluation(result_file): |
| results = [] |
| f = open(result_file, 'r') |
| for line in f: |
| results.append(json.loads(line)) |
| f.close() |
|
|
| total, s_correct = 0, 0 |
| total_time, total_token = 0, 0 |
|
|
| total_steps = 0 |
| total_experts = 0 |
| |
| for idx, problem in enumerate(results): |
|
|
| expected_answer = problem['answer_index'] |
| correctness = extract_boxed_text(problem['answer'], expected_answer) |
|
|
| total += 1 |
| total_time += problem['time'] |
| total_token += problem['tokens'] |
| s_correct += correctness |
|
|
| total_steps += problem.get('steps', 0) |
| total_experts += problem.get('unique_experts_count', 0) |
|
|
| print(f"Strict Match Accuracy = {s_correct}/{total} = {s_correct/total}") |
| return { |
| 'strict_accuracy': s_correct / total, |
| 'strict_match': s_correct, |
| 'total': total, |
| 'total_time': total_time, |
| 'total_token': total_token, |
| 'token/s': total_token / total_time, |
| 'avg_steps': total_steps / total if total > 0 else 0, |
| 'unique_experts': total_experts / total if total > 0 else 0, |
| } |
|
|
| def process_target(target, dataset): |
| if dataset == 'gsm8k': |
| target = int(target.split('#### ')[-1].replace(',','')) |
| return target |
| elif dataset == 'aime': |
| return target |
| else: |
| raise ValueError('Unknown dataset') |
|
|
| if __name__ == '__main__': |
| args = argparse.ArgumentParser() |
| args.add_argument('--result_file', type=str, default='results.csv') |
| args.add_argument('--dataset', type=str, default='gpqa') |
| args.add_argument('--split', type=str, default='test') |
| args.add_argument('--num-samples', type=int, default=None) |
|
|
| args = args.parse_args() |
| |
| results = json.load(open(args.result_file, 'r')) |
|
|
| total, s_correct = 0, 0 |
| for idx, problem in enumerate(results): |
| if args.num_samples is not None and idx >= args.num_samples: |
| break |
| |
| expected_answer = problem['gt'] |
| correctness = extract_boxed_text(problem['answer'], expected_answer) |
|
|
| total += 1 |
| s_correct += correctness |
|
|
| print(f"Strict Match Accuracy = {s_correct}/{total} = {s_correct/total}") |
|
|
|
|