diff --git a/pymbolic/interop/common.py b/pymbolic/interop/common.py index 5243a8326605019dc5ad84f631386b7a2848bfee..7b986d8cdb981d9b85c744b93e992d991b2211de 100644 --- a/pymbolic/interop/common.py +++ b/pymbolic/interop/common.py @@ -157,8 +157,7 @@ class PymbolicToSympyLikeMapper(EvaluationMapper): ) def map_derivative(self, expr): - return self.sym.Derivative(self.rec(expr.child), - *[self.sym.Symbol(v) for v in expr.variables]) + raise NotImplementedError() # }}} diff --git a/pymbolic/interop/symengine.py b/pymbolic/interop/symengine.py index 6746f85f2b5e7eb0d74882cd9bf17b2d953bd523..ab68e7fde1596e390ad59e55b40827589d9c6f80 100644 --- a/pymbolic/interop/symengine.py +++ b/pymbolic/interop/symengine.py @@ -90,6 +90,10 @@ class PymbolicToSymEngineMapper(PymbolicToSympyLikeMapper): raise RuntimeError( "do not know how to translate '%s' to symengine" % expr) + def map_derivative(self, expr): + return self.sym.Derivative(self.rec(expr.child), + [self.sym.Symbol(v) for v in expr.variables]) + # }}} # vim: fdm=marker diff --git a/pymbolic/interop/sympy.py b/pymbolic/interop/sympy.py index 2f538a7858eb0ef10d8610e2ea705f5c6cdd35fe..7e1f4399a6ce0bf21c5931f084e1b1aef6d7c3fc 100644 --- a/pymbolic/interop/sympy.py +++ b/pymbolic/interop/sympy.py @@ -73,6 +73,10 @@ class PymbolicToSympyMapper(PymbolicToSympyLikeMapper): raise RuntimeError( "do not know how to translate '%s' to sympy" % expr) + def map_derivative(self, expr): + return self.sym.Derivative(self.rec(expr.child), + *[self.sym.Symbol(v) for v in expr.variables]) + # }}} diff --git a/test/test_sympy.py b/test/test_sympy.py index 2286d266ba667bfe60a59c12ffc87612d873a02a..f5d294a55e4efbe4e315e498eed3cebb4e89aa20 100644 --- a/test/test_sympy.py +++ b/test/test_sympy.py @@ -37,12 +37,12 @@ except ImportError: import pymbolic.primitives as prim -x_, y_ = (prim.Variable(s) for s in "xy") +x_, y_ = (prim.Variable(s) for s in "x y".split()) # {{{ to pymbolic test -def _test_to_pymbolic(mapper, sym): +def _test_to_pymbolic(mapper, sym, use_symengine): x, y = sym.symbols("x,y") assert mapper(sym.Rational(3, 4)) == prim.Quotient(3, 4) @@ -50,8 +50,9 @@ def _test_to_pymbolic(mapper, sym): assert mapper(sym.Subs(x**2, (x,), (y,))) == \ prim.Substitution(x_**2, ("x",), (y_,)) - assert mapper(sym.Derivative(x**2, x)) == \ - prim.Derivative(x_**2, ("x",)) + # FIXME in symengine + deriv = sym.Derivative(x**2, (x,)) if use_symengine else sym.Derivative(x**2, x) + assert mapper(deriv) == prim.Derivative(x_**2, ("x",)) # functions assert mapper(sym.Function("f")(x)) == prim.Variable("f")(x_) @@ -71,19 +72,19 @@ def test_symengine_to_pymbolic(): sym = pytest.importorskip("symengine.sympy_compat") mapper = SymEngineToPymbolicMapper() - _test_to_pymbolic(mapper, sym) + _test_to_pymbolic(mapper, sym, True) def test_sympy_to_pymbolic(): import sympy as sym mapper = SympyToPymbolicMapper() - _test_to_pymbolic(mapper, sym) + _test_to_pymbolic(mapper, sym, False) # {{{ from pymbolic test -def _test_from_pymbolic(mapper, sym): +def _test_from_pymbolic(mapper, sym, use_symengine): x, y = sym.symbols("x,y") assert mapper(x_ + y_) == x + y @@ -92,11 +93,14 @@ def _test_from_pymbolic(mapper, sym): assert mapper(prim.Substitution(x_**2, ("x",), (y_,))) == \ sym.Subs(x**2, (x,), (y,)) - assert mapper(prim.Derivative(x_**2, ("x",))) == \ - sym.Derivative(x**2, x) + # FIXME in symengine + deriv = sym.Derivative(x**2, (x,)) if use_symengine else sym.Derivative(x**2, x) + assert mapper(prim.Derivative(x_**2, ("x",))) == deriv assert mapper(x_[0]) == sym.Symbol("x_0") + assert mapper(prim.Variable("f")(x_)) == sym.Function("f")(x) + # }}} @@ -104,14 +108,14 @@ def test_pymbolic_to_symengine(): sym = pytest.importorskip("symengine.sympy_compat") mapper = PymbolicToSymEngineMapper() - _test_from_pymbolic(mapper, sym) + _test_from_pymbolic(mapper, sym, True) def test_pymbolic_to_sympy(): import sympy as sym mapper = PymbolicToSympyMapper() - _test_from_pymbolic(mapper, sym) + _test_from_pymbolic(mapper, sym, False) if __name__ == "__main__":