diff --git a/.test-conda-env-py3.yml b/.test-conda-env-py3.yml index 2264e926055b28bf7bde2c3ddaa54f38bed42221..9f8c38d0c6ed36158f420701e9835c631701e15d 100644 --- a/.test-conda-env-py3.yml +++ b/.test-conda-env-py3.yml @@ -12,12 +12,12 @@ dependencies: - islpy - pyopencl - python=3 -- python-symengine=0.6.0 +- python-symengine=0.6.1 - pyfmmlib - pip - pip: - git+https://github.com/inducer/pytools - git+https://gitlab.tiker.net/inducer/boxtree - - git+https://github.com/inducer/pymbolic + - git+https://gitlab.tiker.net/inducer/pymbolic - git+https://github.com/inducer/loopy diff --git a/requirements.txt b/requirements.txt index efe91f9487cb17f063b456973aabd909f153aae7..f522da7df8b139af7e7d53177ee9d597d2aaf063 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ numpy sympy==1.1.1 git+https://github.com/inducer/pytools -git+https://github.com/inducer/pymbolic +git+https://gitlab.tiker.net/inducer/pymbolic git+https://github.com/inducer/islpy git+https://github.com/inducer/pyopencl git+https://gitlab.tiker.net/inducer/boxtree diff --git a/sumpy/assignment_collection.py b/sumpy/assignment_collection.py index dadf3fc954e890c2ecc53716feb4857187a14d2b..f12c6d596b5b3ce7594a5ea11a1cd3116c3fb9b4 100644 --- a/sumpy/assignment_collection.py +++ b/sumpy/assignment_collection.py @@ -185,16 +185,20 @@ class SymbolicAssignmentCollection(object): new_assignments, new_exprs = cse(assign_exprs + extra_exprs, symbols=self.symbol_generator) + xreplace_dict = {} + for name, value in new_assignments: + new_value = sym.make_cse(value.xreplace(xreplace_dict)) + xreplace_dict[name] = new_value + + for i in range(len(new_exprs)): + new_exprs[i] = new_exprs[i].xreplace(xreplace_dict) + new_assign_exprs = new_exprs[:len(assign_exprs)] new_extra_exprs = new_exprs[len(assign_exprs):] for name, new_expr in zip(assign_names, new_assign_exprs): self.assignments[name] = new_expr - for name, value in new_assignments: - assert isinstance(name, sym.Symbol) - self.add_assignment(name.name, value) - logger.info("common subexpression elimination: done after {dur:.2f} s" .format(dur=time.time() - start_time)) return new_extra_exprs diff --git a/sumpy/codegen.py b/sumpy/codegen.py index 085f9bd459f08b6bcb1ae19dff227c80970ab8cf..9e52afa0da1775dc758fd8c011c035ca55e9797f 100644 --- a/sumpy/codegen.py +++ b/sumpy/codegen.py @@ -67,10 +67,6 @@ class SympyToPymbolicMapper(SympyToPymbolicMapperBase): def not_supported(self, expr): if isinstance(expr, int): return expr - elif getattr(expr, "is_Function", False): - func_name = SympyToPymbolicMapperBase.function_name(self, expr) - return prim.Variable(func_name)( - *tuple(self.rec(arg) for arg in expr.args)) else: return SympyToPymbolicMapperBase.not_supported(self, expr) diff --git a/sumpy/symbolic.py b/sumpy/symbolic.py index 7a86958aebd7eea6c8054b11e61413314886ebe9..0de2f80ab6bb39f61c2c09c6f5d0461bab594708 100644 --- a/sumpy/symbolic.py +++ b/sumpy/symbolic.py @@ -80,13 +80,15 @@ Derivative Integer Matrix Subs I pi functions""".split() if USE_SYMENGINE: import symengine as sym - from pymbolic.interop.symengine import ( + from pymbolic.interop.symengine import ( # noqa: F401 PymbolicToSymEngineMapper as PymbolicToSympyMapper, - SymEngineToPymbolicMapper as SympyToPymbolicMapper) + SymEngineToPymbolicMapper as SympyToPymbolicMapper, + make_cse) else: import sympy as sym - from pymbolic.interop.sympy import ( - PymbolicToSympyMapper, SympyToPymbolicMapper) + from pymbolic.interop.sympy import ( # noqa: F401 + PymbolicToSympyMapper, SympyToPymbolicMapper, + make_cse) for _apifunc in SYMBOLIC_API: globals()[_apifunc] = getattr(sym, _apifunc)