From 10bdb1c933fed84e20f880633688d2c0cba8eb8a Mon Sep 17 00:00:00 2001 From: Isuru Fernando Date: Mon, 2 Mar 2020 19:29:06 -0600 Subject: [PATCH 1/2] Move code from sympy to common to support symengine --- pymbolic/interop/common.py | 49 ++++++++++++++++++++++++++++++++- pymbolic/interop/symengine.py | 3 --- pymbolic/interop/sympy.py | 51 ----------------------------------- 3 files changed, 48 insertions(+), 55 deletions(-) diff --git a/pymbolic/interop/common.py b/pymbolic/interop/common.py index 23ea2ea..4a0f179 100644 --- a/pymbolic/interop/common.py +++ b/pymbolic/interop/common.py @@ -123,6 +123,28 @@ class SympyLikeToPymbolicMapper(SympyLikeMapperBase): else: return SympyLikeMapperBase.not_supported(self, expr) + def map_Piecewise(self, expr): # noqa + # We only handle piecewises with 2 arguments! + assert len(expr.args) == 2 + # We only handle if/else cases + assert expr.args[1][1].is_Boolean and bool(expr.args[1][1]) is True + then = self.rec(expr.args[0][0]) + else_ = self.rec(expr.args[1][0]) + cond = self.rec(expr.args[0][1]) + return prim.If(cond, then, else_) + + def _comparison_operator(self, expr, operator=None): + left = self.rec(expr.args[0]) + right = self.rec(expr.args[1]) + return prim.Comparison(left, operator, right) + + map_Equality = partial(_comparison_operator, operator="==") # noqa: N815 + map_Unequality = partial(_comparison_operator, operator="!=") # noqa: N815 + map_GreaterThan = partial(_comparison_operator, operator=">=") # noqa: N815 + map_LessThan = partial(_comparison_operator, operator="<=") # noqa: N815 + map_StrictGreaterThan = partial(_comparison_operator, operator=">") # noqa: N815 + map_StrictLessThan = partial(_comparison_operator, operator="<") # noqa: N815 + # }}} @@ -166,8 +188,33 @@ class PymbolicToSympyLikeMapper(EvaluationMapper): tuple(self.rec(v) for v in expr.values), ) + def map_if(self, expr): + cond = self.rec(expr.condition) + return self.sym.Piecewise((self.rec(expr.then), cond), + (self.rec(expr.else_), True) + ) + + def map_comparison(self, expr): + left = self.rec(expr.left) + right = self.rec(expr.right) + if expr.operator == "==": + return self.sym.Equality(left, right) + elif expr.operator == "!=": + return self.sym.Unequality(left, right) + elif expr.operator == "<": + return self.sym.StrictLessThan(left, right) + elif expr.operator == ">": + return self.sym.StrictGreaterThan(left, right) + elif expr.operator == "<=": + return self.sym.LessThan(left, right) + elif expr.operator == ">=": + return self.sym.GreaterThan(left, right) + else: + raise NotImplementedError("Unknown operator '%s'" % expr.operator) + def map_derivative(self, expr): - raise NotImplementedError() + return self.sym.Derivative(self.rec(expr.child), + *[self.sym.Symbol(v) for v in expr.variables]) # }}} diff --git a/pymbolic/interop/symengine.py b/pymbolic/interop/symengine.py index 4603424..e7491a0 100644 --- a/pymbolic/interop/symengine.py +++ b/pymbolic/interop/symengine.py @@ -90,9 +90,6 @@ 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]) # }}} diff --git a/pymbolic/interop/sympy.py b/pymbolic/interop/sympy.py index 38a99cc..e933e9f 100644 --- a/pymbolic/interop/sympy.py +++ b/pymbolic/interop/sympy.py @@ -69,28 +69,6 @@ class SympyToPymbolicMapper(SympyLikeToPymbolicMapper): tuple(self.rec(i) for i in expr.args[1:]) ) - def map_Piecewise(self, expr): # noqa - # We only handle piecewises with 2 arguments! - assert len(expr.args) == 2 - # We only handle if/else cases - assert expr.args[1][1].is_Boolean and bool(expr.args[1][1]) is True - then = self.rec(expr.args[0][0]) - else_ = self.rec(expr.args[1][0]) - cond = self.rec(expr.args[0][1]) - return prim.If(cond, then, else_) - - def _comparison_operator(self, expr, operator=None): - left = self.rec(expr.args[0]) - right = self.rec(expr.args[1]) - return prim.Comparison(left, operator, right) - - map_Equality = partial(_comparison_operator, operator="==") # noqa: N815 - map_Unequality = partial(_comparison_operator, operator="!=") # noqa: N815 - map_GreaterThan = partial(_comparison_operator, operator=">=") # noqa: N815 - map_LessThan = partial(_comparison_operator, operator="<=") # noqa: N815 - map_StrictGreaterThan = partial(_comparison_operator, operator=">") # noqa: N815 - map_StrictLessThan = partial(_comparison_operator, operator="<") # noqa: N815 - # }}} @@ -104,40 +82,11 @@ 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]) - def map_subscript(self, expr): return self.sym.Indexed( self.rec(expr.aggregate), *tuple(self.rec(i) for i in expr.index_tuple) ) - - def map_if(self, expr): - cond = self.rec(expr.condition) - return self.sym.Piecewise((self.rec(expr.then), cond), - (self.rec(expr.else_), True) - ) - - def map_comparison(self, expr): - left = self.rec(expr.left) - right = self.rec(expr.right) - if expr.operator == "==": - return self.sym.Equality(left, right) - elif expr.operator == "!=": - return self.sym.Unequality(left, right) - elif expr.operator == "<": - return self.sym.StrictLessThan(left, right) - elif expr.operator == ">": - return self.sym.StrictGreaterThan(left, right) - elif expr.operator == "<=": - return self.sym.LessThan(left, right) - elif expr.operator == ">=": - return self.sym.GreaterThan(left, right) - else: - raise NotImplementedError("Unknown operator '%s'" % expr.operator) - # }}} -- GitLab From 44ddcb2d890a3dbd2c2d8d2367a417912dbc070a Mon Sep 17 00:00:00 2001 From: Isuru Fernando Date: Mon, 2 Mar 2020 20:08:13 -0600 Subject: [PATCH 2/2] Fix imports --- pymbolic/interop/common.py | 1 + pymbolic/interop/sympy.py | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pymbolic/interop/common.py b/pymbolic/interop/common.py index 4a0f179..458c103 100644 --- a/pymbolic/interop/common.py +++ b/pymbolic/interop/common.py @@ -24,6 +24,7 @@ THE SOFTWARE. import pymbolic.primitives as prim from pymbolic.mapper.evaluator import EvaluationMapper +from functools import partial class SympyLikeMapperBase(object): diff --git a/pymbolic/interop/sympy.py b/pymbolic/interop/sympy.py index e933e9f..cce923b 100644 --- a/pymbolic/interop/sympy.py +++ b/pymbolic/interop/sympy.py @@ -29,7 +29,6 @@ from pymbolic.interop.common import ( SympyLikeToPymbolicMapper, PymbolicToSympyLikeMapper) import pymbolic.primitives as prim -from functools import partial import sympy -- GitLab