Skip to content

Commit e2c603b

Browse files
committed
DRY
1 parent a25025a commit e2c603b

File tree

2 files changed

+52
-41
lines changed

2 files changed

+52
-41
lines changed

mathics/core/convert/sympy.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,16 @@
113113
}
114114

115115

116+
def sympy_decode_mathics_symbol_name(name: str):
117+
"""
118+
Remove the Prefix for Mathics symbols
119+
and restore the context separator character.
120+
"""
121+
if name.startswith(SYMPY_SYMBOL_PREFIX):
122+
return name[len(SYMPY_SYMBOL_PREFIX) :].replace("_", "`")
123+
return name
124+
125+
116126
def is_Cn_expr(name: str) -> bool:
117127
"""Check if name is of the form {prefix}Cnnn"""
118128
if name.startswith(SYMPY_SYMBOL_PREFIX) or name.startswith(SYMPY_SLOT_PREFIX):
@@ -373,13 +383,12 @@ def old_from_sympy(expr) -> BaseElement:
373383
if "_" not in name:
374384
name = f"sympy`dummy`Dummy${expr.dummy_index}" # type: ignore[attr-defined]
375385
else:
376-
name = name[len(SYMPY_SYMBOL_PREFIX) :].replace("_", "`")
386+
name = sympy_decode_mathics_symbol_name(name)
377387
# Probably, this should be the value attribute
378388
return Symbol(name)
379389
if is_Cn_expr(name):
380390
return Expression(SymbolC, Integer(int(name[1:])))
381-
if name.startswith(SYMPY_SYMBOL_PREFIX):
382-
name = name[len(SYMPY_SYMBOL_PREFIX) :].replace("_", "`")
391+
name = sympy_decode_mathics_symbol_name(name)
383392
if name.startswith(SYMPY_SLOT_PREFIX):
384393
index = int(name[len(SYMPY_SLOT_PREFIX) :])
385394
return Expression(SymbolSlot, Integer(index))
@@ -545,8 +554,7 @@ def old_from_sympy(expr) -> BaseElement:
545554
Expression(Symbol("C"), Integer(int(name[1:]))),
546555
*[from_sympy(arg) for arg in expr.args],
547556
)
548-
if name.startswith(SYMPY_SYMBOL_PREFIX):
549-
name = name[len(SYMPY_SYMBOL_PREFIX) :].replace("_", "`")
557+
name = sympy_decode_mathics_symbol_name(name)
550558
args = [from_sympy(arg) for arg in expr.args]
551559
builtin = sympy_to_mathics.get(name)
552560
if builtin is not None:

test/core/test_sympy_python_convert.py

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
SYMPY_SYMBOL_PREFIX,
2626
Symbol,
2727
SymbolPlus,
28+
sympy_name,
2829
)
2930
from mathics.core.systemsymbols import (
3031
SymbolD,
@@ -36,6 +37,12 @@
3637
SymbolSlot,
3738
)
3839

40+
Symbol_f = Symbol("Global`f")
41+
Symbol_x = Symbol("Global`x")
42+
Symbol_y = Symbol("Global`y")
43+
Symbol_z = Symbol("Global`z")
44+
Symbol_Mathics_User_x = Symbol("Mathics`User`x")
45+
3946

4047
class SympyConvert(unittest.TestCase):
4148
def compare_to_sympy(self, mathics_expr, sympy_expr, **kwargs):
@@ -49,10 +56,10 @@ def compare(self, mathics_expr, sympy_expr, **kwargs):
4956
self.compare_to_mathics(mathics_expr, sympy_expr)
5057

5158
def testSymbol(self):
52-
self.compare(Symbol("Global`x"), sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_x"))
59+
self.compare(Symbol_x, sympy.Symbol(sympy_name(Symbol_x)))
5360
self.compare(
54-
Symbol("Mathics`User`x"),
55-
sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Mathics_User_x"),
61+
Symbol_Mathics_User_x,
62+
sympy.Symbol(sympy_name(Symbol_Mathics_User_x)),
5663
)
5764

5865
def testReal(self):
@@ -87,25 +94,25 @@ def testString(self):
8794

8895
def testAdd(self):
8996
self.compare(
90-
Expression(SymbolPlus, Integer1, Symbol("Global`x")),
91-
sympy.Add(sympy.Integer(1), sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_x")),
97+
Expression(SymbolPlus, Integer1, Symbol_x),
98+
sympy.Add(sympy.Integer(1), sympy.Symbol(sympy_name(Symbol_x))),
9299
)
93100

94101
def testIntegrate(self):
95102
self.compare(
96-
Expression(SymbolIntegrate, Symbol("Global`x"), Symbol("Global`y")),
103+
Expression(SymbolIntegrate, Symbol_x, Symbol_y),
97104
sympy.Integral(
98-
sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_x"),
99-
sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_y"),
105+
sympy.Symbol(sympy_name(Symbol_x)),
106+
sympy.Symbol(sympy_name(Symbol_y)),
100107
),
101108
)
102109

103110
def testDerivative(self):
104111
self.compare(
105-
Expression(SymbolD, Symbol("Global`x"), Symbol("Global`y")),
112+
Expression(SymbolD, Symbol_x, Symbol_y),
106113
sympy.Derivative(
107-
sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_x"),
108-
sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_y"),
114+
sympy.Symbol(sympy_name(Symbol_x)),
115+
sympy.Symbol(sympy_name(Symbol_y)),
109116
),
110117
)
111118

@@ -114,47 +121,43 @@ def testDerivative2(self):
114121

115122
head = Expression(
116123
Expression(SymbolDerivative, Integer1, Integer0),
117-
Symbol("Global`f"),
124+
Symbol_f,
118125
)
119-
expr = Expression(head, Symbol("Global`x"), Symbol("Global`y"))
126+
expr = Expression(head, Symbol_x, Symbol_y)
120127

121-
sfxy = sympy.Function(str(f"{SYMPY_SYMBOL_PREFIX}Global_f"))(
122-
sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_x"),
123-
sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_y"),
124-
)
125-
sym_expr = sympy.Derivative(
126-
sfxy, sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_x")
128+
sfxy = sympy.Function(sympy_name(Symbol_f))(
129+
sympy.Symbol(sympy_name(Symbol_x)),
130+
sympy.Symbol(sympy_name(Symbol_y)),
127131
)
132+
sym_expr = sympy.Derivative(sfxy, sympy.Symbol(sympy_name(Symbol_x)))
128133

129134
self.compare_to_sympy(expr, sym_expr, **kwargs)
130135
# compare_to_mathics fails because Derivative becomes D (which then evaluates to Derivative)
131136

132137
def testConvertedFunctions(self):
133138
kwargs = {"converted_functions": set(["Global`f"])}
134139

135-
marg1 = Expression(Symbol("Global`f"), Symbol("Global`x"))
136-
sarg1 = sympy.Function(str(f"{SYMPY_SYMBOL_PREFIX}Global_f"))(
137-
sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_x")
138-
)
140+
marg1 = Expression(Symbol_f, Symbol_x)
141+
sarg1 = sympy.Function(sympy_name(Symbol_f))(sympy.Symbol(sympy_name(Symbol_x)))
139142
self.compare(marg1, sarg1, **kwargs)
140143

141-
marg2 = Expression(Symbol("Global`f"), Symbol("Global`x"), Symbol("Global`y"))
142-
sarg2 = sympy.Function(str(f"{SYMPY_SYMBOL_PREFIX}Global_f"))(
143-
sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_x"),
144-
sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_y"),
144+
marg2 = Expression(Symbol_f, Symbol_x, Symbol_y)
145+
sarg2 = sympy.Function(sympy_name(Symbol_f))(
146+
sympy.Symbol(sympy_name(Symbol_x)),
147+
sympy.Symbol(sympy_name(Symbol_y)),
145148
)
146149
self.compare(marg2, sarg2, **kwargs)
147150

148151
self.compare(
149-
Expression(SymbolD, marg2, Symbol("Global`x")),
150-
sympy.Derivative(sarg2, sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_x")),
152+
Expression(SymbolD, marg2, Symbol_x),
153+
sympy.Derivative(sarg2, sympy.Symbol(sympy_name(Symbol_x))),
151154
**kwargs,
152155
)
153156

154157
def testExpression(self):
155158
self.compare(
156-
Expression(SymbolSin, Symbol("Global`x")),
157-
sympy.sin(sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_x")),
159+
Expression(SymbolSin, Symbol_x),
160+
sympy.sin(sympy.Symbol(sympy_name(Symbol_x))),
158161
)
159162

160163
def testConstant(self):
@@ -163,14 +166,14 @@ def testConstant(self):
163166

164167
def testGamma(self):
165168
self.compare(
166-
Expression(SymbolGamma, Symbol("Global`z")),
167-
sympy.gamma(sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_z")),
169+
Expression(SymbolGamma, Symbol_z),
170+
sympy.gamma(sympy.Symbol(sympy_name(Symbol_z))),
168171
)
169172
self.compare(
170-
Expression(SymbolGamma, Symbol("Global`z"), Symbol("Global`x")),
173+
Expression(SymbolGamma, Symbol_z, Symbol_x),
171174
sympy.uppergamma(
172-
sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_z"),
173-
sympy.Symbol(f"{SYMPY_SYMBOL_PREFIX}Global_x"),
175+
sympy.Symbol(sympy_name(Symbol_z)),
176+
sympy.Symbol(sympy_name(Symbol_x)),
174177
),
175178
)
176179

0 commit comments

Comments
 (0)