File size: 4,491 Bytes
48bf4bb
 
 
 
42bb7ad
 
48bf4bb
42bb7ad
 
48bf4bb
 
 
 
 
42bb7ad
48bf4bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42bb7ad
48bf4bb
 
 
 
 
 
 
 
 
 
 
42bb7ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48bf4bb
 
42bb7ad
 
48bf4bb
 
 
 
 
42bb7ad
48bf4bb
 
42bb7ad
48bf4bb
 
42bb7ad
48bf4bb
 
42bb7ad
e8c0a63
48bf4bb
 
e8c0a63
48bf4bb
42bb7ad
 
 
 
 
 
 
 
48bf4bb
 
 
 
 
 
42bb7ad
 
 
 
48bf4bb
 
 
42bb7ad
 
 
48bf4bb
 
42bb7ad
48bf4bb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import gradio as gr
import ctranslate2
from transformers import AutoTokenizer
from huggingface_hub import snapshot_download
from codeexecutor import get_majority_vote,type_check,postprocess_completion,draw_polynomial_plot


import re
import os
# Define the model and tokenizer loading
model_prompt = "Explain and solve the following mathematical problem step by step, showing all work: "
tokenizer = AutoTokenizer.from_pretrained("AI-MO/NuminaMath-7B-TIR")
model_path = snapshot_download(repo_id="Makima57/deepseek-math-Numina")
generator = ctranslate2.Generator(model_path, device="cpu", compute_type="int8")
iterations = 4

# Function to generate predictions using the model
def get_prediction(question):
    input_text = model_prompt + question
    input_tokens = tokenizer.tokenize(input_text)
    results = generator.generate_batch(
        [input_tokens],
        max_length=512,
        sampling_temperature=0.7,
        sampling_topk=40,
    )
    output_tokens = results[0].sequences[0]
    predicted_answer = tokenizer.convert_tokens_to_string(output_tokens)
    return predicted_answer

# Function to parse the prediction to extract the answer and steps
def parse_prediction(prediction):
    lines = prediction.strip().split('\n')
    answer = None
    steps = []
    for line in lines:
        # Check for "Answer:" or "answer:"
        match = re.match(r'^\s*(?:Answer|answer)\s*[:=]\s*(.*)', line)
        if match:
            answer = match.group(1).strip()
        else:
            steps.append(line)
    if answer is None:
        # If no "Answer:" found, assume last line is the answer
        answer = lines[-1].strip()
        steps = lines
    steps_text = '\n'.join(steps).strip()
    return answer, steps_text

# Function to perform majority voting and get steps
def majority_vote_with_steps(question, num_iterations=10):
    all_predictions = []
    all_answers = []
    steps_list = []

    for _ in range(num_iterations):
        prediction = get_prediction(question)
        answer,sucess= postprocess_completion(prediction, return_status=True, last_code_block=True)
        if sucess:
            all_predictions.append(prediction)
            all_answers.append(answer)
            steps_list.append(prediction)
            majority_voted_ans = get_majority_vote(all_answers)
        else:
            answer, steps = parse_prediction(prediction)
            all_predictions.append(prediction)
            all_answers.append(answer)
            steps_list.append(steps)
            majority_voted_ans = get_majority_vote(all_answers)
            if type_check(majority_voted_ans)=="Polynomial":
                plotfile=draw_polynomial_plot(majority_voted_ans)
                #draw plot of polynomial


    # Get the majority voted answer
    


    # Find the steps corresponding to the majority voted answer
    for i, ans in enumerate(all_answers):
        if ans == majority_voted_ans:
            steps_solution = steps_list[i]
            answer=parse_prediction(steps_solution)
            break
    else:
        answer=majority_voted_ans
        steps_solution = "No steps found"

    return answer, steps_solution,plotfile

def gradio_interface(question, correct_answer):
    final_answer, steps_solution,plotfile = majority_vote_with_steps(question, iterations)
    return question, final_answer, steps_solution, correct_answer,

# Custom CSS for enhanced design (unchanged)


# Define the directory path
flagging_dir = "./flagged_data" 

# Create the directory if it doesn't exist
if not os.path.exists(flagging_dir):
    os.makedirs(flagging_dir)

# Gradio app setup with flagging
interface = gr.Interface(
    fn=gradio_interface,
    inputs=[
        gr.Textbox(label="🧠 Math Question", placeholder="Enter your math question here...", elem_id="math_question"),
    ],
    outputs=[
        gr.Textbox(label="Question", interactive=False),  # Non-editable
        gr.Textbox(label="Answer", interactive=False),  # Non-editable
        gr.Textbox(label="Solution", interactive=True),  # Editable textbox for correct solution
        gr.Image(label="Polynomial Plot")
    ],
    title="🔢 Math Question Solver",
    description="Enter a math question to get the model's majority-voted answer and steps to solve the problem.",
    css=custom_css,  # Apply custom CSS
    flagging_dir=flagging_dir,  # Directory to save flagged data
    allow_flagging="auto"  # Allow users to auto flag data
)

if __name__ == "__main__":
    interface.launch()