diff --git a/pymbolic/sympy_conv.py b/pymbolic/sympy_interface.py similarity index 73% rename from pymbolic/sympy_conv.py rename to pymbolic/sympy_interface.py index 079a14acde9d80a88d96019d0484b7f7fddad9ee..d8421d1d40c25d961b6a81088155c64c111b41b7 100644 --- a/pymbolic/sympy_conv.py +++ b/pymbolic/sympy_interface.py @@ -1,5 +1,6 @@ from __future__ import division import pymbolic.primitives as prim +from pymbolic.mapper.evaluator import EvaluationMapper import sympy as sp @@ -99,3 +100,29 @@ class SympyToPymbolicMapper(_SympyMapper): *tuple(self.rec(arg) for arg in expr.args)) else: return _SympyMapper.not_supported(self, expr) + + + + +class PymbolicToSympyMapper(EvaluationMapper): + def map_variable(self, expr): + return sp.Symbol(expr.name) + + def map_call(self, expr): + if isinstance(expr.function, prim.Variable): + func_name = expr.function.name + try: + func = getattr(sp.functions, func_name) + except AttributeError: + func = sp.Function(func_name) + return func(*[self.rec(par) for par in expr.parameters]) + else: + raise RuntimeError("do not know how to translate '%s' to sympy" + % expr) + + def map_subscript(self, expr): + if isinstance(expr.aggregate, prim.Variable) and isinstance(expr.index, int): + return sp.Symbol("%s_%d" % (expr.aggregate.name, expr.index)) + else: + raise RuntimeError("do not know how to translate '%s' to sympy" + % expr)