Skip to content

Commit cd522bf

Browse files
committed
feat: improved parsing, calculation and error handling
1 parent 4d474b0 commit cd522bf

File tree

1 file changed

+59
-28
lines changed
  • packages/math-service/src

1 file changed

+59
-28
lines changed

packages/math-service/src/app.py

Lines changed: 59 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,80 @@
11
from flask import Flask, request, jsonify, render_template
2-
from sympy import symbols, sympify, E
2+
from sympy import symbols, sympify, E, Limit, simplify, oo, zoo
33
from sympy.parsing.latex import parse_latex
44

55
app = Flask(__name__)
66

7-
def get_symbols_from_latex(latex_eq):
7+
def get_symbols_from_latex(latex_eq, variable_values={}):
88
parsed_expr = parse_latex(latex_eq)
9-
variable_names = parsed_expr.free_symbols
10-
symbols_dict = {str(var): symbols(str(var)) if str(var) != 'e' else E for var in variable_names}
9+
variable_names = {str(var) for var in parsed_expr.free_symbols if str(var).lower() != 'e'}
10+
symbols_dict = {var: variable_values.get(var, symbols(var)) for var in variable_names}
11+
1112
return symbols_dict
1213

1314
def convert_latex_to_sympy(latex_eq, variable_values):
14-
symbols_dict = get_symbols_from_latex(latex_eq)
15+
symbols_dict = get_symbols_from_latex(latex_eq, variable_values)
16+
1517
sympy_expr = parse_latex(latex_eq)
18+
1619
for var, sym in symbols_dict.items():
17-
if var in variable_values and variable_values[var]:
20+
if var in variable_values and variable_values[var] != '':
1821
sympy_expr = sympy_expr.subs(parse_latex(var), sympify(variable_values[var]))
1922
else:
2023
sympy_expr = sympy_expr.subs(parse_latex(var), sym)
24+
25+
sympy_expr = sympy_expr.subs(parse_latex('e'), E).subs(parse_latex('E'), E)
26+
2127
return sympy_expr, symbols_dict
2228

2329
def get_variable_list(latex_code):
2430
symbols_dict = get_symbols_from_latex(latex_code)
2531
return list(symbols_dict.keys())
2632

33+
34+
2735
def calculate_result(sympy_expr, decimal_point=5):
2836
try:
29-
result = sympy_expr.evalf()
30-
rounded_result = round(result, decimal_point)
37+
if isinstance(sympy_expr, Limit):
38+
sympy_expr = sympy_expr.doit()
39+
40+
if sympy_expr.free_symbols:
41+
simplified_expr = simplify(sympy_expr)
42+
43+
if not simplified_expr.free_symbols:
44+
result = simplified_expr.evalf()
45+
46+
if result == oo or result == -oo or result == zoo:
47+
raise ValueError("The result is divergent.")
48+
49+
if result.is_number:
50+
rounded_result = round(result, decimal_point) if not result.is_integer else int(result)
51+
return {'result': rounded_result, 'error': None}
52+
53+
return {'result': str(simplified_expr), 'error': None}
3154

32-
if decimal_point == 0:
33-
formatted_result = int(rounded_result)
3455
else:
35-
formatted_result = rounded_result
56+
result = sympy_expr.evalf()
3657

37-
return formatted_result
38-
except Exception:
39-
result = sympy_expr.doit()
40-
return result
58+
if result == oo or result == -oo or result == zoo:
59+
raise ValueError("The result is divergent.")
60+
61+
if result.is_number:
62+
rounded_result = round(result, decimal_point) if not result.is_integer else int(result)
63+
return {'result': rounded_result, 'error': None}
64+
else:
65+
return {'result': str(result), 'error': None}
4166

67+
except Exception as e:
68+
return {'result': None, 'error': str(e)}
4269

4370
@app.route('/', methods=['GET', 'POST'])
4471
def index():
4572
if request.method == 'POST':
4673
latex_code = request.form['latex_code']
47-
variable_values = {var: request.form[var] for var in request.form}
48-
sympy_expression, variable_list = convert_latex_to_sympy(latex_code, variable_values)
74+
variable_values = {var: request.form[var] for var in request.form if var != 'latex_code'}
75+
sympy_expression, _ = convert_latex_to_sympy(latex_code, variable_values)
4976
result = calculate_result(sympy_expression)
50-
return render_template('result.html', latex_code=latex_code, sympy_expression=sympy_expression, variable_list=variable_list, result=result)
77+
return render_template('result.html', latex_code=latex_code, sympy_expression=sympy_expression, variable_values=variable_values, result=result)
5178
return render_template('index.html')
5279

5380
@app.route('/get_variables', methods=['POST'])
@@ -59,16 +86,20 @@ def get_variables():
5986

6087
@app.route('/calculate', methods=['POST'])
6188
def calculate():
62-
data = request.get_json()
63-
latex_code = data['latex_code']
64-
variable_values = data.get('variables', {})
65-
options = data.get('options', {})
66-
decimal_point = options.get('decimal_point', 5)
67-
68-
sympy_expression, _ = convert_latex_to_sympy(latex_code, variable_values)
69-
result = calculate_result(sympy_expression, decimal_point)
70-
71-
return jsonify({'result':str(result)})
89+
try:
90+
data = request.get_json()
91+
latex_code = data['latex_code']
92+
variable_values = data.get('variables', {})
93+
options = data.get('options', {})
94+
decimal_point = options.get('decimal_point', 5)
95+
96+
sympy_expression, _ = convert_latex_to_sympy(latex_code, variable_values)
97+
result = calculate_result(sympy_expression, decimal_point)
98+
99+
return jsonify({'result': str(result['result']), 'error': str(result['error'])})
100+
101+
except Exception as e:
102+
return jsonify({'result': None, 'error': str(e)})
72103

73104
if __name__ == '__main__':
74105
app.run(debug=True, port=8006)

0 commit comments

Comments
 (0)