diff --git a/mira/metamodel/utils.py b/mira/metamodel/utils.py index 9b3df9968..e77732fb3 100644 --- a/mira/metamodel/utils.py +++ b/mira/metamodel/utils.py @@ -8,15 +8,22 @@ def get_parseable_expression(s: str) -> str: """Return an expression that can be parsed using sympy.""" + # Handle lambda which cannot be parsed by sympy s = s.replace('lambda', 'XXlambdaXX') + # Handle dots which also cannot be parsed s = re.sub(r'\.(?=\D)', 'XX_XX', s) + # Handle curly braces which are not allowed in sympy + s = s.replace('{', 'XXCBO').replace('}', 'XXCBC') s = unicodedata.normalize('NFKC', s) return s def revert_parseable_expression(s: str) -> str: """Return an expression to its original form.""" - return s.replace('XXlambdaXX', 'lambda').replace("XX_XX", ".") + s = s.replace('XXCBO', '{').replace('XXCBC', '}') + s = s.replace('XX_XX', '.') + s = s.replace('XXlambdaXX', 'lambda') + return s def safe_parse_expr(s: str, local_dict=None) -> sympy.Expr: diff --git a/tests/test_metamodel.py b/tests/test_metamodel.py index de9af67a3..6fd3f46f4 100644 --- a/tests/test_metamodel.py +++ b/tests/test_metamodel.py @@ -240,7 +240,13 @@ def test_from_askenet_petri_mathml(): assert mathml_str == org_str -def test_safe_parse(): +def test_safe_parse_nfkc(): eps = 'ϵ' eps_sym = sympy.Symbol(eps) assert safe_parse_expr(eps, local_dict={eps: eps_sym}) == eps_sym + + +def test_safe_parse_curly_braces(): + var = 'x_{a}' + var_sym = sympy.Symbol('x_{a}') + assert safe_parse_expr(var, local_dict={var: var_sym}) == var_sym \ No newline at end of file