aciang commited on
Commit
2318650
·
verified ·
1 Parent(s): 3e7998b

Upload folder using huggingface_hub

Browse files
Files changed (3) hide show
  1. README.md +2 -2
  2. app.py +26 -46
  3. requirements.txt +1 -1
README.md CHANGED
@@ -2,11 +2,11 @@
2
  title: LanguageBridge — Math Fast Agent (SymPy)
3
  emoji: 🧮
4
  colorFrom: yellow
5
- colorTo: blue
6
  sdk: gradio
7
  sdk_version: "4.44.1"
8
  app_file: app.py
9
  pinned: false
10
  ---
11
 
12
- **SymPy** 的數學推理代理(不依賴 LLM)。支援一次貼上長式、簡化、解一元/聯立方程與基本微積分。
 
2
  title: LanguageBridge — Math Fast Agent (SymPy)
3
  emoji: 🧮
4
  colorFrom: yellow
5
+ colorTo: gray
6
  sdk: gradio
7
  sdk_version: "4.44.1"
8
  app_file: app.py
9
  pinned: false
10
  ---
11
 
12
+ 純 SymPy 的數學推理代理(不依賴 LLM),支援一次貼上長式、簡化、解一元/聯立方程。
app.py CHANGED
@@ -8,81 +8,61 @@ def solve_math(q: str):
8
  q = (q or "").strip()
9
  if not q:
10
  return "請輸入算式或方程,例如:2x+3=11;或:sin(x)**2 + cos(x)**2;或:factor(x**2-9)"
11
-
12
  try:
13
- # 情境 A:含 '=' → 視為(可能多條)方程,支援分號/換行分隔
14
  if "=" in q:
15
- # 將多行與分號斷開
16
- parts = []
17
- for seg in q.split(";"):
18
- parts += [s.strip() for s in seg.split("\n")]
19
- parts = [s for s in parts if s]
20
-
21
- eqs = []
22
- syms = set()
23
  for s in parts:
 
 
24
  if "=" not in s:
25
  continue
26
  left, right = s.split("=", 1)
27
- L = sp.sympify(left)
28
- R = sp.sympify(right)
29
- eq = sp.Eq(L, R)
30
  eqs.append(eq)
31
- syms |= L.free_symbols | R.free_symbols
32
-
33
- if not eqs:
34
- return "沒有可解析的方程式。"
35
  if not syms:
36
- syms = {sp.symbols("x")}
37
-
38
- # 解聯立(回傳 dict 列表)
39
  sol = sp.solve(eqs, list(syms), dict=True)
40
  if not sol:
41
  return "無解或需要更多條件。"
42
-
43
  lines = []
44
  for i, s in enumerate(sol, 1):
45
- lines.append(
46
- "解 {}: ".format(i) + ", ".join(f"{k} = {sp.simplify(v)}" for k, v in s.items())
47
- )
48
  return "\n".join(lines)
49
 
50
- # 情境 B:純表達式 → 嘗試簡化、因式、微分、積分
51
  expr = sp.sympify(q)
52
- out = []
53
-
54
  try:
55
- simp = sp.simplify(expr)
56
- out.append(f"簡化:{simp}")
57
  except Exception:
58
- pass
59
-
60
  try:
61
- fac = sp.factor(expr)
62
- if fac != expr:
63
- out.append(f"因式分解:{fac}")
64
  except Exception:
65
  pass
66
-
67
  try:
68
  x = list(expr.free_symbols)[0] if expr.free_symbols else sp.symbols("x")
69
- out.append(f"對 {x} 微分:{sp.diff(expr, x)}")
70
- out.append(f"對 {x} 積分:{sp.integrate(expr, x)}")
71
  except Exception:
72
  pass
73
-
74
- return "\n".join(out) if out else f"結果:{expr}"
75
-
76
  except Exception as e:
77
  return f"解析失敗:{e}"
78
 
79
  with gr.Blocks(title=TITLE) as demo:
80
- gr.Markdown(f"## {TITLE}\n- 貼上**算式/方程**(可多行;或用分號 `;` 分隔聯立)\n- 範例:`2x+3=11`、`x+y=3; x-y=1`、`sin(x)**2 + cos(x)**2`、`factor(x**2-9)`")
81
  q = gr.Textbox(lines=6, label="題目 / 算式(可含聯立方程)")
82
- out = gr.Textbox(lines=12, label="輸出")
83
- btn = gr.Button("送出 🚀")
84
- btn.click(solve_math, q, out)
85
 
86
  if __name__ == "__main__":
87
- # 在 Colab 預覽:一定要 share=True 才會印出 public URL
88
- demo.launch(share=True)
 
8
  q = (q or "").strip()
9
  if not q:
10
  return "請輸入算式或方程,例如:2x+3=11;或:sin(x)**2 + cos(x)**2;或:factor(x**2-9)"
 
11
  try:
12
+ # 支援方程/聯立:可用分號或換行分隔
13
  if "=" in q:
14
+ parts = [s.strip() for seg in q.split(";") for s in seg.split("\n")]
15
+ eqs, syms = [], set()
 
 
 
 
 
 
16
  for s in parts:
17
+ if not s:
18
+ continue
19
  if "=" not in s:
20
  continue
21
  left, right = s.split("=", 1)
22
+ eq = sp.Eq(sp.sympify(left), sp.sympify(right))
 
 
23
  eqs.append(eq)
24
+ syms |= eq.free_symbols
25
+ if hasattr(eq, "rhs"):
26
+ syms |= eq.rhs.free_symbols
 
27
  if not syms:
28
+ x = sp.symbols("x")
29
+ syms = {x}
 
30
  sol = sp.solve(eqs, list(syms), dict=True)
31
  if not sol:
32
  return "無解或需要更多條件。"
 
33
  lines = []
34
  for i, s in enumerate(sol, 1):
35
+ lines.append(f"解 {i}: " + ", ".join([f"{k} = {sp.simplify(v)}" for k, v in s.items()]))
 
 
36
  return "\n".join(lines)
37
 
38
+ # 非方程:做一輪常見操作
39
  expr = sp.sympify(q)
40
+ tips = []
 
41
  try:
42
+ tips.append(f"簡化:{sp.simplify(expr)}")
 
43
  except Exception:
44
+ tips.append(f"簡化:{expr}")
 
45
  try:
46
+ fact = sp.factor(expr)
47
+ if fact != expr:
48
+ tips.append(f"因式分解:{fact}")
49
  except Exception:
50
  pass
 
51
  try:
52
  x = list(expr.free_symbols)[0] if expr.free_symbols else sp.symbols("x")
53
+ tips.append(f"對 {x} 微分:{sp.diff(expr, x)}")
54
+ tips.append(f"對 {x} 積分:{sp.integrate(expr, x)}")
55
  except Exception:
56
  pass
57
+ return "\n".join(tips) if tips else f"結果:{expr}"
 
 
58
  except Exception as e:
59
  return f"解析失敗:{e}"
60
 
61
  with gr.Blocks(title=TITLE) as demo:
62
+ gr.Markdown(f"## {TITLE}\n貼上算式(可多行 / 用分號 `;` 分隔):")
63
  q = gr.Textbox(lines=6, label="題目 / 算式(可含聯立方程)")
64
+ out = gr.Textbox(lines=10, label="輸出")
65
+ gr.Button("送出 🚀").click(fn=solve_math, inputs=q, outputs=out)
 
66
 
67
  if __name__ == "__main__":
68
+ demo.launch()
 
requirements.txt CHANGED
@@ -1,3 +1,3 @@
1
  gradio==4.44.1
2
  sympy>=1.12
3
- huggingface_hub>=0.24.0
 
1
  gradio==4.44.1
2
  sympy>=1.12
3
+ huggingface_hub==0.23.4