MasteredUltraInstinct commited on
Commit
8cf9b2c
Β·
verified Β·
1 Parent(s): 5ac77bc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +20 -22
app.py CHANGED
@@ -18,7 +18,9 @@ def clean_latex(latex):
18
  latex = latex.replace('\\ ', '')
19
  latex = latex.replace('\\\\', '\\')
20
  latex = re.sub(r'\\[ \t\n\r\f\v]*', '', latex)
 
21
  latex = re.sub(r'\\([+\-=])', r'\1', latex)
 
22
  replacements = {
23
  r'\\chi': 'x', r'chi': 'x',
24
  r'\\xi': 'x', r'xi': 'x',
@@ -32,23 +34,32 @@ def clean_latex(latex):
32
  }
33
  for wrong, correct in replacements.items():
34
  latex = re.sub(wrong, correct, latex)
35
- latex = re.sub(r'\\(cal|mathcal)\s*\{?\s*[XxYyZz]\s*\}?', lambda m: m.group(0)[-2], latex)
36
- latex = latex.replace('cal x', 'x').replace('mathcal x', 'x')
 
 
 
 
 
 
37
  latex = latex.replace('{', '').replace('}', '')
38
  latex = latex.strip().rstrip(',.')
39
  latex = re.sub(r'(?<![a-zA-Z0-9])e(?![a-zA-Z0-9])', 'E', latex)
 
40
  latex = re.sub(r'(\d)([a-zA-Z])', r'\1*\2', latex)
41
  latex = re.sub(r'(\d+)\s*i', r'\1*I', latex)
42
  latex = re.sub(r'(?<![a-zA-Z0-9])i(?![a-zA-Z0-9])', 'I', latex)
43
  latex = re.sub(r'\(([^()]+?)\)\s*([a-zA-Z](\^\d+)?)', r'(\1)*\2', latex)
 
44
  latex = latex.replace(r'\cdot', '*')
45
- latex = latex.replace('βˆ’', '-') # Unicode minus
46
  latex = re.sub(r'[^\w\s^=+*\-().]', '', latex)
 
47
  if '=' not in latex:
48
  latex += '=0'
 
49
  return latex
50
 
51
- # Fallback to external LLM microservice
52
  def request_llm_fallback(bad_latex, llm_url):
53
  pre_cleaned = re.sub(
54
  r'(\\!?pm|\\not=?|\\!|\\L|\\perp|\\bar|\\Sigma|\\boldmath|G|L(?=\^))', '', bad_latex
@@ -61,7 +72,6 @@ def request_llm_fallback(bad_latex, llm_url):
61
  print(f"LLM fallback failed: {e}")
62
  return pre_cleaned
63
 
64
- # Request human-style explanation
65
  def request_llm_explanation(latex, llm_url):
66
  try:
67
  response = requests.post(f"{llm_url}/explain", json={"prompt": latex})
@@ -72,7 +82,6 @@ def request_llm_explanation(latex, llm_url):
72
  except Exception as e:
73
  return f"❌ LLM explanation error: {e}"
74
 
75
- # Main solver
76
  def solve_polynomial(image, llm_url):
77
  try:
78
  img = preprocess_handwritten_image(image)
@@ -85,21 +94,14 @@ def solve_polynomial(image, llm_url):
85
 
86
  try:
87
  expr = parse_latex(cleaned_latex)
88
-
89
- # βœ… Replace pi and e by name
90
- for symbol in expr.free_symbols:
91
- if str(symbol) == 'pi':
92
- expr = expr.subs(symbol, sp.Float(3.1416))
93
- elif str(symbol) == 'e':
94
- expr = expr.subs(symbol, sp.Float(2.7183))
95
 
96
  if not isinstance(expr, sp.Equality):
97
  raise ValueError("Expression is not an equation.")
98
-
99
  lhs_minus_rhs = expr.lhs - expr.rhs
100
  if not lhs_minus_rhs.is_polynomial():
101
  raise ValueError("Expression is not a polynomial.")
102
-
103
  junk_symbols = {"pm", "cdot", "mathrm", "boldmath", "bar", "L"}
104
  symbols = {str(s) for s in expr.free_symbols}
105
  if symbols & junk_symbols:
@@ -109,13 +111,8 @@ def solve_polynomial(image, llm_url):
109
  cleaned_latex = clean_latex(fixed_latex)
110
  try:
111
  expr = parse_latex(cleaned_latex)
112
-
113
- # βœ… Repeat fix in fallback too
114
- for symbol in expr.free_symbols:
115
- if str(symbol) == 'pi':
116
- expr = expr.subs(symbol, sp.Float(3.1416))
117
- elif str(symbol) == 'e':
118
- expr = expr.subs(symbol, sp.Float(2.7183))
119
 
120
  if not isinstance(expr, sp.Equality):
121
  raise ValueError("Expression is not an equation.")
@@ -173,6 +170,7 @@ def solve_polynomial(image, llm_url):
173
  except Exception as e:
174
  return f"❌ **Error**: {str(e)}", "", ""
175
 
 
176
  # Gradio UI
177
  with gr.Blocks() as demo:
178
  llm_url = gr.Textbox(label="πŸ”— Enter LLM Microservice URL (from Colab)", placeholder="https://xxxx.ngrok-free.app")
 
18
  latex = latex.replace('\\ ', '')
19
  latex = latex.replace('\\\\', '\\')
20
  latex = re.sub(r'\\[ \t\n\r\f\v]*', '', latex)
21
+
22
  latex = re.sub(r'\\([+\-=])', r'\1', latex)
23
+
24
  replacements = {
25
  r'\\chi': 'x', r'chi': 'x',
26
  r'\\xi': 'x', r'xi': 'x',
 
34
  }
35
  for wrong, correct in replacements.items():
36
  latex = re.sub(wrong, correct, latex)
37
+
38
+ latex = re.sub(r'\\(cal|mathcal)\s*\{?\s*[Xx]\s*\}?', 'x', latex)
39
+ latex = re.sub(r'\\(cal|mathcal)\s*\{?\s*[Yy]\s*\}?', 'y', latex)
40
+ latex = re.sub(r'\\(cal|mathcal)\s*\{?\s*[Zz]\s*\}?', 'z', latex)
41
+
42
+ latex = latex.replace('cal x', 'x').replace('cal X', 'x')
43
+ latex = latex.replace('mathcal x', 'x').replace('mathcal X', 'x')
44
+
45
  latex = latex.replace('{', '').replace('}', '')
46
  latex = latex.strip().rstrip(',.')
47
  latex = re.sub(r'(?<![a-zA-Z0-9])e(?![a-zA-Z0-9])', 'E', latex)
48
+
49
  latex = re.sub(r'(\d)([a-zA-Z])', r'\1*\2', latex)
50
  latex = re.sub(r'(\d+)\s*i', r'\1*I', latex)
51
  latex = re.sub(r'(?<![a-zA-Z0-9])i(?![a-zA-Z0-9])', 'I', latex)
52
  latex = re.sub(r'\(([^()]+?)\)\s*([a-zA-Z](\^\d+)?)', r'(\1)*\2', latex)
53
+
54
  latex = latex.replace(r'\cdot', '*')
55
+ latex = latex.replace('βˆ’', '-')
56
  latex = re.sub(r'[^\w\s^=+*\-().]', '', latex)
57
+
58
  if '=' not in latex:
59
  latex += '=0'
60
+
61
  return latex
62
 
 
63
  def request_llm_fallback(bad_latex, llm_url):
64
  pre_cleaned = re.sub(
65
  r'(\\!?pm|\\not=?|\\!|\\L|\\perp|\\bar|\\Sigma|\\boldmath|G|L(?=\^))', '', bad_latex
 
72
  print(f"LLM fallback failed: {e}")
73
  return pre_cleaned
74
 
 
75
  def request_llm_explanation(latex, llm_url):
76
  try:
77
  response = requests.post(f"{llm_url}/explain", json={"prompt": latex})
 
82
  except Exception as e:
83
  return f"❌ LLM explanation error: {e}"
84
 
 
85
  def solve_polynomial(image, llm_url):
86
  try:
87
  img = preprocess_handwritten_image(image)
 
94
 
95
  try:
96
  expr = parse_latex(cleaned_latex)
97
+ # βœ… Force numeric substitution even if pi/E not in free_symbols
98
+ expr = expr.subs(sp.pi, sp.Float(3.1416)).subs(sp.E, sp.Float(2.7183))
 
 
 
 
 
99
 
100
  if not isinstance(expr, sp.Equality):
101
  raise ValueError("Expression is not an equation.")
 
102
  lhs_minus_rhs = expr.lhs - expr.rhs
103
  if not lhs_minus_rhs.is_polynomial():
104
  raise ValueError("Expression is not a polynomial.")
 
105
  junk_symbols = {"pm", "cdot", "mathrm", "boldmath", "bar", "L"}
106
  symbols = {str(s) for s in expr.free_symbols}
107
  if symbols & junk_symbols:
 
111
  cleaned_latex = clean_latex(fixed_latex)
112
  try:
113
  expr = parse_latex(cleaned_latex)
114
+ # βœ… Apply again after fallback
115
+ expr = expr.subs(sp.pi, sp.Float(3.1416)).subs(sp.E, sp.Float(2.7183))
 
 
 
 
 
116
 
117
  if not isinstance(expr, sp.Equality):
118
  raise ValueError("Expression is not an equation.")
 
170
  except Exception as e:
171
  return f"❌ **Error**: {str(e)}", "", ""
172
 
173
+
174
  # Gradio UI
175
  with gr.Blocks() as demo:
176
  llm_url = gr.Textbox(label="πŸ”— Enter LLM Microservice URL (from Colab)", placeholder="https://xxxx.ngrok-free.app")