in evaluation/latex2sympy/latex2sympy2.py [0:0]
def convert_atom(atom):
if atom.atom_expr():
atom_expr = atom.atom_expr()
# find the atom's text
atom_text = ''
if atom_expr.LETTER_NO_E():
atom_text = atom_expr.LETTER_NO_E().getText()
if atom_text == "I":
return sympy.I
elif atom_expr.GREEK_CMD():
atom_text = atom_expr.GREEK_CMD().getText()[1:].strip()
elif atom_expr.OTHER_SYMBOL_CMD():
atom_text = atom_expr.OTHER_SYMBOL_CMD().getText().strip()
elif atom_expr.accent():
atom_accent = atom_expr.accent()
# get name for accent
name = atom_accent.start.text
# name = atom_accent.start.text[1:]
# exception: check if bar or overline which are treated both as bar
# if name in ["bar", "overline"]:
# name = "bar"
# if name in ["vec", "overrightarrow"]:
# name = "vec"
# if name in ["tilde", "widetilde"]:
# name = "tilde"
# get the base (variable)
base = atom_accent.base.getText()
# set string to base+name
atom_text = name + '{' + base + '}'
# find atom's subscript, if any
subscript_text = ''
if atom_expr.subexpr():
subexpr = atom_expr.subexpr()
subscript = None
if subexpr.expr(): # subscript is expr
subscript = subexpr.expr().getText().strip()
elif subexpr.atom(): # subscript is atom
subscript = subexpr.atom().getText().strip()
elif subexpr.args(): # subscript is args
subscript = subexpr.args().getText().strip()
subscript_inner_text = StrPrinter().doprint(subscript)
if len(subscript_inner_text) > 1:
subscript_text = '_{' + subscript_inner_text + '}'
else:
subscript_text = '_' + subscript_inner_text
# construct the symbol using the text and optional subscript
atom_symbol = sympy.Symbol(atom_text + subscript_text, real=is_real)
# for matrix symbol
matrix_symbol = None
global var
if atom_text + subscript_text in var:
try:
rh = var[atom_text + subscript_text]
shape = sympy.shape(rh)
matrix_symbol = sympy.MatrixSymbol(atom_text + subscript_text, shape[0], shape[1])
variances[matrix_symbol] = variances[atom_symbol]
except:
pass
# find the atom's superscript, and return as a Pow if found
if atom_expr.supexpr():
supexpr = atom_expr.supexpr()
func_pow = None
if supexpr.expr():
func_pow = convert_expr(supexpr.expr())
else:
func_pow = convert_atom(supexpr.atom())
return sympy.Pow(atom_symbol, func_pow, evaluate=False)
return atom_symbol if not matrix_symbol else matrix_symbol
elif atom.SYMBOL():
s = atom.SYMBOL().getText().replace("\\$", "").replace("\\%", "")
if s == "\\infty":
return sympy.oo
elif s == '\\pi':
return sympy.pi
elif s == '\\emptyset':
return sympy.S.EmptySet
else:
raise Exception("Unrecognized symbol")
elif atom.NUMBER():
s = atom.NUMBER().getText().replace(",", "")
try:
sr = sympy.Rational(s)
return sr
except (TypeError, ValueError):
return sympy.Number(s)
elif atom.E_NOTATION():
s = atom.E_NOTATION().getText().replace(",", "")
try:
sr = sympy.Rational(s)
return sr
except (TypeError, ValueError):
return sympy.Number(s)
elif atom.DIFFERENTIAL():
var = get_differential_var(atom.DIFFERENTIAL())
return sympy.Symbol('d' + var.name, real=is_real)
elif atom.mathit():
text = rule2text(atom.mathit().mathit_text())
return sympy.Symbol(text, real=is_real)
elif atom.VARIABLE():
text = atom.VARIABLE().getText()
is_percent = text.endswith("\\%")
trim_amount = 3 if is_percent else 1
name = text[10:]
name = name[0:len(name) - trim_amount]
# add hash to distinguish from regular symbols
hash = hashlib.md5(name.encode()).hexdigest()
symbol_name = name + hash
# replace the variable for already known variable values
if name in VARIABLE_VALUES:
# if a sympy class
if isinstance(VARIABLE_VALUES[name], tuple(sympy.core.all_classes)):
symbol = VARIABLE_VALUES[name]
# if NOT a sympy class
else:
symbol = parse_expr(str(VARIABLE_VALUES[name]))
else:
symbol = sympy.Symbol(symbol_name, real=is_real)
if is_percent:
return sympy.Mul(symbol, sympy.Pow(100, -1, evaluate=False), evaluate=False)
# return the symbol
return symbol
elif atom.PERCENT_NUMBER():
text = atom.PERCENT_NUMBER().getText().replace("\\%", "").replace(",", "")
try:
number = sympy.Rational(text)
except (TypeError, ValueError):
number = sympy.Number(text)
percent = sympy.Rational(number, 100)
return percent