Team Ai
Apppublic

bigcode/Reasoning-with-StarCoder

sourceHugging Faceupdated 3y agoView on Hugging Face
32likes
mathprompter.py138 linesDownload Raw Back to root
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