in src/latex2sympy2_extended/latex2sympy2.py [0:0]
def convert_func(self, func):
if func.func_normal_single_arg():
if func.func_single_arg(): # function called with parenthesis
arg = self.convert_func_arg(func.func_single_arg())
else:
arg = self.convert_func_arg(func.func_single_arg_noparens())
name = func.func_normal_single_arg().start.text[1:]
# get pow
func_pow = None
if func.supexpr():
if func.supexpr().expr():
func_pow = self.convert_expr(func.supexpr().expr())
else:
func_pow = self.convert_atom(func.supexpr().atom())
# change arc<trig> -> a<trig>
if name in ["arcsin", "arccos", "arctan", "arccsc", "arcsec",
"arccot"]:
name = "a" + name[3:]
expr = getattr(sympy_trig, name)(arg, evaluate=False)
elif name in ["arsinh", "arcosh", "artanh"]:
name = "a" + name[2:]
expr = getattr(sympy_hyperbolic, name)(arg, evaluate=False)
elif name in ["arcsinh", "arccosh", "arctanh"]:
name = "a" + name[3:]
expr = getattr(sympy_hyperbolic, name)(arg, evaluate=False)
elif name == "operatorname":
operatorname = func.func_normal_single_arg().func_operator_name.getText()
if operatorname in ["arsinh", "arcosh", "artanh"]:
operatorname = "a" + operatorname[2:]
expr = getattr(sympy_hyperbolic, operatorname)(arg, evaluate=False)
elif operatorname in ["arcsinh", "arccosh", "arctanh"]:
operatorname = "a" + operatorname[3:]
expr = getattr(sympy_hyperbolic, operatorname)(arg, evaluate=False)
elif operatorname == "floor":
expr = self.handle_floor(arg)
elif operatorname == "ceil":
expr = self.handle_ceil(arg)
elif operatorname == 'eye':
expr = sympy.eye(arg)
elif operatorname == 'rank':
expr = sympy.Integer(arg.rank())
elif operatorname in ['trace', 'tr']:
expr = arg.trace()
elif operatorname == 'rref':
expr = arg.rref()[0]
elif operatorname == 'nullspace':
expr = arg.nullspace()
elif operatorname == 'norm':
expr = arg.norm()
elif operatorname == 'cols':
expr = [arg.col(i) for i in range(arg.cols)]
elif operatorname == 'rows':
expr = [arg.row(i) for i in range(arg.rows)]
elif operatorname in ['eig', 'eigen', 'diagonalize']:
expr = arg.diagonalize()
elif operatorname in ['eigenvals', 'eigenvalues']:
expr = arg.eigenvals()
elif operatorname in ['eigenvects', 'eigenvectors']:
expr = arg.eigenvects()
elif operatorname in ['svd', 'SVD']:
expr = arg.singular_value_decomposition()
else:
expr = sympy.Function(operatorname)(arg, evaluate=False)
elif name in ["log", "ln"]:
base = 10
if func.subexpr():
if func.subexpr().atom():
base = self.convert_atom(func.subexpr().atom())
else:
base = self.convert_expr(func.subexpr().expr())
elif name == "log":
base = 10
else:
# it's ln
base = sympy.E
expr = sympy.log(arg, base, evaluate=False)
elif name in ["exp", "exponentialE"]:
expr = sympy.exp(arg, evaluate=False)
elif name == "floor":
expr = self.handle_floor(arg)
elif name == "ceil":
expr = self.handle_ceil(arg)
elif name == 'det':
expr = arg.det()
elif name in ["sin", "cos", "tan", "csc", "sec", "cot"]:
if func_pow == -1:
name = "a" + name
func_pow = None
expr = getattr(sympy_trig, name)(arg, evaluate=False)
elif name in ["sinh", "cosh", "tanh"]:
if func_pow == -1:
name = "a" + name
func_pow = None
expr = getattr(sympy_hyperbolic, name)(arg, evaluate=False)
else:
expr = sympy.Function(name)(arg, evaluate=False)
if func_pow:
expr = sympy.Pow(expr, func_pow, evaluate=False)
return expr
elif func.func_normal_multi_arg():
if func.func_multi_arg(): # function called with parenthesis
args = func.func_multi_arg().getText().split(",")
else:
args = func.func_multi_arg_noparens().split(",")
args = list(map(lambda arg: self.parse(arg), args))
name = func.func_normal_multi_arg().start.text[1:]
if name == "operatorname":
operatorname = func.func_normal_multi_arg().func_operator_name.getText()
if operatorname in ["gcd", "lcm"]:
expr = self.handle_gcd_lcm(operatorname, args)
elif operatorname == 'zeros':
expr = sympy.zeros(*args)
elif operatorname == 'ones':
expr = sympy.ones(*args)
elif operatorname == 'diag':
expr = sympy.diag(*args)
elif operatorname == 'hstack':
expr = sympy.Matrix.hstack(*args)
elif operatorname == 'vstack':
expr = sympy.Matrix.vstack(*args)
elif operatorname in ['orth', 'ortho', 'orthogonal', 'orthogonalize']:
if len(args) == 1:
arg = args[0]
expr = GramSchmidt([arg.col(i) for i in range(arg.cols)], True)
else:
expr = GramSchmidt(args, True)
else:
expr = sympy.Function(operatorname)(*args, evaluate=False)
elif name in ["gcd", "lcm"]:
expr = self.handle_gcd_lcm(name, args)
elif name in ["max", "min"]:
name = name[0].upper() + name[1:]
expr = getattr(sympy_misc, name)(*args, evaluate=False)
else:
expr = sympy.Function(name)(*args, evaluate=False)
func_pow = None
should_pow = True
if func.supexpr():
if func.supexpr().expr():
func_pow = self.convert_expr(func.supexpr().expr())
else:
func_pow = self.convert_atom(func.supexpr().atom())
if func_pow and should_pow:
expr = sympy.Pow(expr, func_pow, evaluate=False)
return expr
elif func.atom_expr_no_supexpr():
# define a function
f = sympy.Function(func.atom_expr_no_supexpr().getText())
# args
args = func.func_common_args().getText().split(",")
if args[-1] == '':
args = args[:-1]
args = [self.parse(arg) for arg in args]
# supexpr
if func.supexpr():
if func.supexpr().expr():
expr = self.convert_expr(func.supexpr().expr())
else:
expr = self.convert_atom(func.supexpr().atom())
return sympy.Pow(f(*args), expr, evaluate=False)
else:
return f(*args)
elif func.FUNC_INT():
return self.handle_integral(func)
elif func.FUNC_SQRT():
expr = self.convert_expr(func.base)
if func.root:
r = self.convert_expr(func.root)
return sympy.Pow(expr, 1 / r, evaluate=False)
else:
return sympy.Pow(expr, sympy.S.Half, evaluate=False)
elif func.FUNC_SUM():
return self.handle_sum_or_prod(func, "summation")
elif func.FUNC_PROD():
return self.handle_sum_or_prod(func, "product")
elif func.FUNC_LIM():
return self.handle_limit(func)
elif func.EXP_E():
return self.handle_exp(func)