11from 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
33from sympy .parsing .latex import parse_latex
44
55app = 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
1314def 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
2329def get_variable_list (latex_code ):
2430 symbols_dict = get_symbols_from_latex (latex_code )
2531 return list (symbols_dict .keys ())
2632
33+
34+
2735def 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' ])
4471def 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' ])
6188def 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
73104if __name__ == '__main__' :
74105 app .run (debug = True , port = 8006 )
0 commit comments