bigcode/Reasoning-with-StarCoder
32
1import pandas as pd2import numpy as np3import re4from prompt import algebric_prompt, python_prompt5from utils import generate_response, run_code6 7 8def generate_algebric_template(question):9 var_names = [chr(i) for i in range(ord('A'), ord('Z') + 1)]10 pattern = re.compile(r"[-+]?\d*\.\d+|\d+")11 var_map = {}12 matches = re.findall(pattern, question)13 14 for i, num in enumerate(matches):15 var_name = var_names[i]16 question = question.replace(num, var_name)17 var_map[var_name] = float(num)18 return question, var_map19 20 21def generate_algebric_expression(question, param):22 question = question.strip()23 query = algebric_prompt.format(question=question).strip() + "\n"24 response = generate_response(query, param)25 expression = response.split(f"#Ques: {question}")[-1].strip()26 return expression.split("Answer = ")[-1]27 28 29def generate_python_code(question, equation, param):30 query = python_prompt.format(question=question.strip(), expression=equation.strip()).strip() + "\n"31 response = generate_response(query, param)32 function_code = response.split("# Function for above expression is:")[-1].strip()33 return function_code34 35 36def run(question, random_candidates, hps):37 question, var_map = generate_algebric_template(question)38 39 # generating the random candidates for arguments40 random_mapping = pd.DataFrame(columns=list(var_map.keys()))41 42 for _ in range(random_candidates):43 random_mapping.loc[len(random_mapping)] = np.random.randint(1, 100, (len(random_mapping.columns),))44 45 candidates = []46 acc = []47 # accumulating results48 N = len(hps)49 for i in range(N):50 51 expression = generate_algebric_expression(question, hps[i])52 code = generate_python_code(question, expression, hps[i])53 candidates.append((expression, code))54 current_acc = 055 56 try:57 for idx in range(5):58 arguments = random_mapping.iloc[idx].to_list()59 60 # running expression61 exp = expression62 temp_code = code63 64 for k, v in zip(list(var_map.keys()), arguments):65 exp = exp.replace(k, str(v))66 exp = "print(" + exp + ")"67 68 if "input(" in exp or "input(" in temp_code:69 acc.append(0)70 continue71 72 exp_ans = run_code(exp)73 74 # running code75 parameters = temp_code.split("\n")[0].split("def solution")[-1][1:-2].split(",")76 if '' in parameters:77 parameters.remove('')78 79 arguments = [(param.strip(), int(random_mapping.iloc[idx][param.strip()])) for param in parameters]80 arg_string = ""81 for param, val in arguments:82 arg_string += f"{param}={val},"83 func_call = f"\nprint(solution({arg_string[:-1]}))"84 temp_code += func_call85 code_ans = run_code(temp_code)86 87 current_acc += int(exp_ans == code_ans)88 89 # reverting the changes90 exp = expression91 temp_code = code92 except Exception as ex:93 pass94 acc.append(current_acc)95 96 candidate_index = np.argmax(acc)97 top_candidate = candidates[candidate_index]98 return top_candidate, var_map99 100 101def solve_mp(question):102 hps = [0.9, 0.95]103 (expression, code), var_map = run(question, 5, hps)104 exp_op = None105 code_op = None106 try:107 # expression output108 for k, v in var_map.items():109 expression = expression.replace(k, str(v))110 expression = "print(" + expression + ")"111 print(expression)112 113 if "input(" in expression:114 raise Exception115 exp_op = run_code(expression)116 except:117 print("expression cannot be executed", expression)118 try:119 # code output120 parameters = code.split("\n")[0].split("def solution")[-1][1:-2].split(",")121 if '' in parameters:122 parameters.remove('')123 124 arguments = [(param.strip(), int(var_map[param.strip()])) for param in parameters]125 arg_string = ""126 for param, val in arguments:127 arg_string += f"{param}={val},"128 func_call = f"\nprint(solution({arg_string[:-1]}))"129 code += func_call130 if "input(" in code:131 print("code cannot be executed")132 raise Exception133 code_op = run_code(code)134 except:135 return None, None, code, expression136 137 return exp_op, code_op, code, expression138 