Spaces:
Runtime error
Runtime error
import os | |
import gradio as gr | |
from PIL import Image | |
import sympy as sp | |
from sympy.parsing.latex import parse_latex | |
import re | |
try: | |
from pix2tex.cli import LatexOCR | |
if os.path.exists("trained_model"): | |
model = LatexOCR(weights="trained_model") | |
else: | |
model = None | |
except Exception as e: | |
model = None | |
def preprocess_handwritten_image(pil_img): | |
return pil_img.convert('RGB') | |
def clean_latex(latex): | |
latex = re.sub(r'\\(cal|mathcal)\s*X', 'x', latex) | |
latex = latex.replace('{', '').replace('}', '') | |
latex = latex.strip().rstrip(',.') | |
latex = re.sub(r'(\d+)\s*\\pi', r'(\1*3.1416)', latex) | |
latex = latex.replace(r'\pi', '3.1416') | |
latex = re.sub(r'(\d+)\s*e', r'(\1*2.7183)', latex) | |
latex = re.sub(r'(?<![a-zA-Z0-9])e(?![a-zA-Z0-9])', '2.7183', latex) | |
latex = re.sub(r'(\d)([a-zA-Z])', r'\1*\2', latex) | |
latex = re.sub(r'(\d+)\s*i', r'\1*I', latex) | |
latex = re.sub(r'(?<![a-zA-Z0-9])i(?![a-zA-Z0-9])', 'I', latex) | |
latex = re.sub(r'\(([^()]+?)\)\s*([xX](\^\d+)?)', r'(\1)*\2', latex) | |
if '=' not in latex: | |
latex += '=0' | |
return latex | |
def solve_polynomial(image): | |
if model is None: | |
return "β No trained model found. Please run training first to create `trained_model/`." | |
try: | |
img = preprocess_handwritten_image(image) | |
latex_result = model(img) | |
cleaned_latex = clean_latex(latex_result) | |
expr = parse_latex(cleaned_latex) | |
output = f"## π Extracted LaTeX\n```\n{latex_result}\n```\n---\n" | |
output += f"## π§Ή Cleaned LaTeX Used\n```\n{cleaned_latex}\n```\n---\n" | |
output += f"## π§ Parsed Expression\n\n$$ {sp.latex(expr)} $$\n---\n" | |
if isinstance(expr, sp.Equality): | |
lhs = expr.lhs - expr.rhs | |
output += "## βοΈ Step 1: Standard Form\n" | |
output += f"$$ {sp.latex(lhs)} = 0 $$\n---\n" | |
output += "## π§© Step 2: Factorized\n" | |
output += f"$$ {sp.latex(sp.factor(lhs))} = 0 $$\n---\n" | |
output += "## β Step 3: Roots\n" | |
roots = sp.solve(sp.Eq(lhs, 0), dict=True) | |
if roots: | |
output += "$$\n\\begin{aligned}\n" | |
for i, sol in enumerate(roots, 1): | |
for var, val in sol.items(): | |
output += f"\\text{{Root {i}}}: {var} &= {sp.latex(val)}\\\\\n" | |
output += "\\end{aligned}\n$$" | |
else: | |
output += "## β Simplified\n" | |
output += f"$$ {sp.latex(sp.simplify(expr))} $$" | |
return output | |
except Exception as e: | |
return f"β **Error**: {str(e)}" | |
demo = gr.Interface( | |
fn=solve_polynomial, | |
inputs=gr.Image(type="pil", label="π· Upload Image"), | |
outputs=gr.Markdown(label="π Solution"), | |
title="π§ Handwritten Polynomial Solver", | |
description="Upload a handwritten polynomial. The app extracts, solves, and explains it step-by-step.", | |
allow_flagging="never" | |
) | |
if __name__ == "__main__": | |
demo.launch() | |