Skip to content

Commit

Permalink
Merge pull request #290 from gyorilab/parse_curly_braces
Browse files Browse the repository at this point in the history
Implement safe parsing of curly braces
  • Loading branch information
bgyori authored Feb 26, 2024
2 parents bf0189b + 76c68d8 commit ef5873c
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
9 changes: 8 additions & 1 deletion mira/metamodel/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
8 changes: 7 additions & 1 deletion tests/test_metamodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit ef5873c

Please sign in to comment.