From a3efaccc16b6927b3163720bd82d93997dd682ed Mon Sep 17 00:00:00 2001 From: Isuru Fernando Date: Sat, 14 Jan 2023 14:15:08 +0530 Subject: [PATCH] Convert negative exponentiation to positive + division --- sumpy/symbolic.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/sumpy/symbolic.py b/sumpy/symbolic.py index 01adb6e8..c1599a5d 100644 --- a/sumpy/symbolic.py +++ b/sumpy/symbolic.py @@ -37,6 +37,7 @@ __doc__ = """ import numpy as np from pymbolic.mapper import IdentityMapper as IdentityMapperBase import pymbolic.primitives as prim +import math import logging logger = logging.getLogger(__name__) @@ -111,6 +112,7 @@ Function = sym.Function Symbol = sym.Symbol Derivative = sym.Derivative Integer = sym.Integer +Rational = sym.Rational Matrix = sym.Matrix Subs = sym.Subs I = sym.I # noqa: E741 @@ -293,6 +295,27 @@ class SympyToPymbolicMapper(SympyToPymbolicMapperBase): return SpatialConstant.from_sympy(expr) return SympyToPymbolicMapperBase.map_Symbol(self, expr) + def map_Pow(self, expr): # noqa: N802 + if expr.exp == -1: + return 1/self.rec(expr.base) + else: + return SympyToPymbolicMapperBase.map_Pow(self, expr) + + def map_Mul(self, expr): # noqa: N802 + num_args = [] + den_args = [] + for child in expr.args: + if isinstance(child, Pow) and isinstance(child.exp, Integer) \ + and child.exp < 0: + den_args.append(self.rec(child.base)**(-self.rec(child.exp))) + elif isinstance(child, Rational) and not isinstance(child, Integer): + num_args.append(self.rec(child.p)) + den_args.append(self.rec(child.q)) + else: + num_args.append(self.rec(child)) + + return math.prod(num_args) / math.prod(den_args) + class PymbolicToSympyMapperWithSymbols(PymbolicToSympyMapper): def map_variable(self, expr): -- GitLab