aciang commited on
Commit
e87a45f
·
verified ·
1 Parent(s): 851524e

Update app.py/requirements/README: implicit mult + safe README (no sdk_version)

Browse files
Files changed (3) hide show
  1. README.md +0 -1
  2. app.py +20 -18
  3. requirements.txt +2 -1
README.md CHANGED
@@ -4,7 +4,6 @@ emoji: 🧮
4
  colorFrom: gray
5
  colorTo: indigo
6
  sdk: gradio
7
- sdk_version: "4"
8
  app_file: app.py
9
  pinned: false
10
  ---
 
4
  colorFrom: gray
5
  colorTo: indigo
6
  sdk: gradio
 
7
  app_file: app.py
8
  pinned: false
9
  ---
app.py CHANGED
@@ -1,4 +1,4 @@
1
-
2
  import re
3
  import gradio as gr
4
  import sympy as sp
@@ -9,7 +9,7 @@ from sympy.parsing.sympy_parser import (
9
 
10
  TITLE = "LanguageBridge — Math Fast Agent (SymPy)"
11
 
12
- # ---------- 輸入正規化:隱式乘法 / ^→** / 全形→半形 / √→sqrt ----------
13
  def normalize_ascii(s: str) -> str:
14
  table = str.maketrans({
15
  '(':'(', ')':')', ',':',', ';':';', ':':':',
@@ -19,17 +19,17 @@ def normalize_ascii(s: str) -> str:
19
  return s.translate(table)
20
 
21
  def auto_insert_stars(s: str) -> str:
22
- s = re.sub(r'(\d)([A-Za-z])', r'\1*\2', s) # 3x -> 3*x
23
- s = re.sub(r'([A-Za-z0-9_])\(', r'\1*(', s) # x( -> x*(
24
- s = re.sub(r'\)([A-Za-z0-9_])', r')*\1', s) # )x -> )*x
25
- s = re.sub(r'(\d)\s*sqrt', r'\1*sqrt', s) # 2sqrt -> 2*sqrt
26
  return s
27
 
28
  def preprocess(expr: str) -> str:
29
  s = (expr or "").strip()
30
  s = normalize_ascii(s)
31
- s = s.replace("^", "**") # 2^3 -> 2**3
32
- s = auto_insert_stars(s) # 隱式乘法 -> 顯式
33
  return s
34
 
35
  TRANS = standard_transformations + (implicit_multiplication_application, convert_xor)
@@ -49,12 +49,14 @@ def to_sympy_eq(s: str):
49
  def solve_math(q: str):
50
  q = (q or "").strip()
51
  if not q:
52
- return "請輸入算式或方程,例如:2x+3=11;sin(x)^2 + cos(x)^2;factor(x^2-9)"
 
53
  try:
 
54
  parts = [s.strip() for seg in q.split(";") for s in seg.split("\n")]
55
  parts = [p for p in parts if p]
56
 
57
- # 有 '=' 就走解方程(可聯立)
58
  if any("=" in p for p in parts):
59
  eqs, syms = [], set()
60
  for s in parts:
@@ -67,12 +69,12 @@ def solve_math(q: str):
67
  sol = sp.solve(eqs, list(syms), dict=True)
68
  if not sol:
69
  return "無解或需要更多條件。"
70
- return "\n".join(
71
- f"解 {i}: " + ", ".join([f\"{k} = {sp.simplify(v)}\" for k, v in d.items()])
72
  for i, d in enumerate(sol, 1)
73
  )
74
 
75
- # 否則當一般表達式:簡化/因式/微分/積分
76
  expr = to_sympy_expr(q)
77
  out = []
78
  try: out.append(f"簡化:{sp.simplify(expr)}")
@@ -86,20 +88,20 @@ def solve_math(q: str):
86
  out.append(f"對 {x} 微分:{sp.diff(expr, x)}")
87
  out.append(f"對 {x} 積分:{sp.integrate(expr, x)}")
88
  except Exception: pass
89
- return "\n".join(out) if out else f"結果:{expr}"
 
90
  except Exception as e:
91
  return f"解析失敗:{e}"
92
 
93
  with gr.Blocks(title=TITLE) as demo:
94
  gr.Markdown(
95
  "## " + TITLE + "\\n"
96
- "貼上算式(可多行 / 用分號 `;` 分隔)。\\n\\n"
97
- "**可直接輸入隱式乘法:** `3x`、`2(x+1)`、`(x)(x+1)`、`2sqrt(x)`;"
98
- "也可用 `x^2`(自動轉為 `x**2`),`√(x)`(自動轉為 `sqrt(x)`)。"
99
  )
100
  q = gr.Textbox(lines=6, label="題目 / 算式(可含聯立方程)")
101
  out = gr.Textbox(lines=12, label="輸出")
102
  gr.Button("送出 🚀").click(fn=solve_math, inputs=q, outputs=out)
103
 
104
  if __name__ == "__main__":
105
- demo.launch() # 在 Space 環境不用 share
 
1
+ \
2
  import re
3
  import gradio as gr
4
  import sympy as sp
 
9
 
10
  TITLE = "LanguageBridge — Math Fast Agent (SymPy)"
11
 
12
+ # ---- 正規化:全形→半形、√→sqrt、^→**、自動補乘號(隱式→顯式) ----
13
  def normalize_ascii(s: str) -> str:
14
  table = str.maketrans({
15
  '(':'(', ')':')', ',':',', ';':';', ':':':',
 
19
  return s.translate(table)
20
 
21
  def auto_insert_stars(s: str) -> str:
22
+ s = re.sub(r'(\d)([A-Za-z])', r'\1*\2', s) # 3x -> 3*x
23
+ s = re.sub(r'([A-Za-z0-9_])\(', r'\1*(', s) # x( -> x*(
24
+ s = re.sub(r'\)([A-Za-z0-9_])', r')*\1', s) # )x -> )*x
25
+ s = re.sub(r'(\d)\s*sqrt', r'\1*sqrt', s) # 2sqrt -> 2*sqrt
26
  return s
27
 
28
  def preprocess(expr: str) -> str:
29
  s = (expr or "").strip()
30
  s = normalize_ascii(s)
31
+ s = s.replace("^", "**") # 2^3 -> 2**3
32
+ s = auto_insert_stars(s) # 隱式乘法補 *
33
  return s
34
 
35
  TRANS = standard_transformations + (implicit_multiplication_application, convert_xor)
 
49
  def solve_math(q: str):
50
  q = (q or "").strip()
51
  if not q:
52
+ return "請輸入算式或方程,例如:3x+7=1;sin(x)^2 + cos(x)^2;factor(x^4-1)"
53
+
54
  try:
55
+ # 允許多行或分號分隔
56
  parts = [s.strip() for seg in q.split(";") for s in seg.split("\n")]
57
  parts = [p for p in parts if p]
58
 
59
+ # 有 '=' :解方程(可聯立)
60
  if any("=" in p for p in parts):
61
  eqs, syms = [], set()
62
  for s in parts:
 
69
  sol = sp.solve(eqs, list(syms), dict=True)
70
  if not sol:
71
  return "無解或需要更多條件。"
72
+ return "\\n".join(
73
+ f"解 {i}: " + ", ".join([f"{k} = {sp.simplify(v)}" for k, v in d.items()])
74
  for i, d in enumerate(sol, 1)
75
  )
76
 
77
+ # 否則視為一般表達式:簡化/因式/微分/積分
78
  expr = to_sympy_expr(q)
79
  out = []
80
  try: out.append(f"簡化:{sp.simplify(expr)}")
 
88
  out.append(f"對 {x} 微分:{sp.diff(expr, x)}")
89
  out.append(f"對 {x} 積分:{sp.integrate(expr, x)}")
90
  except Exception: pass
91
+ return "\\n".join(out) if out else f"結果:{expr}"
92
+
93
  except Exception as e:
94
  return f"解析失敗:{e}"
95
 
96
  with gr.Blocks(title=TITLE) as demo:
97
  gr.Markdown(
98
  "## " + TITLE + "\\n"
99
+ "貼上算式(可多行 / `;` 分隔)。支援:隱式乘法 `3x`, `2(x+1)`, `(x)(x+1)`, `2sqrt(x)`;"
100
+ "`x^2` 自動轉 `x**2`,`√(x)` 自動轉 `sqrt(x)`。"
 
101
  )
102
  q = gr.Textbox(lines=6, label="題目 / 算式(可含聯立方程)")
103
  out = gr.Textbox(lines=12, label="輸出")
104
  gr.Button("送出 🚀").click(fn=solve_math, inputs=q, outputs=out)
105
 
106
  if __name__ == "__main__":
107
+ demo.launch()
requirements.txt CHANGED
@@ -1,2 +1,3 @@
1
- gradio>=4.0.0
2
  sympy>=1.12
 
 
1
+ gradio==4.44.1
2
  sympy>=1.12
3
+ huggingface_hub==0.23.4