From c3519e39527975cbc1b716ffac16d06d62691352 Mon Sep 17 00:00:00 2001
From: Dominic Kempf <dominic.kempf@iwr.uni-heidelberg.de>
Date: Thu, 7 Sep 2017 09:38:37 +0200
Subject: [PATCH] Fix more sympy glitches: Floor Division and mod!

---
 python/dune/perftool/sympy.py | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/python/dune/perftool/sympy.py b/python/dune/perftool/sympy.py
index 853751b9..4999ad8a 100644
--- a/python/dune/perftool/sympy.py
+++ b/python/dune/perftool/sympy.py
@@ -43,11 +43,25 @@ class MyPymbolicToSympyMapper(PymbolicToSympyMapper):
 
 
 class MySympyToPymbolicMapper(SympyToPymbolicMapper):
+    def map_floor(self, expr):
+        # Try finding patterns arising from FloorDiv
+        assert isinstance(expr.args[0], sp.Mul)
+        margs = expr.args[0].args
+        if isinstance(margs[1], sp.Pow) and int(margs[1].args[1]) == -1:
+            return prim.FloorDiv(self.rec(margs[0]), self.rec(margs[1].args[0]))
+        elif isinstance(margs[0], sp.Rational) and margs[0].as_numer_denom()[0] == 1:
+            return prim.FloorDiv(self.rec(margs[1]), self.rec(margs[0].as_numer_denom()[1]))
+        else:
+            raise NotImplementedError("Congratulations, sympy.floor showed you its deficits!")
+
     def map_Indexed(self, expr):
         return prim.Subscript(self.rec(expr.args[0].args[0]),
                               tuple(self.rec(i) for i in expr.args[1:])
                               )
 
+    def map_Mod(self, expr):
+        return prim.Remainder(self.rec(expr.args[0]), self.rec(expr.args[1]))
+
     def map_Symbol(self, expr):
         s = expr.name.split('$')
         r = prim.Variable(s[0])
@@ -85,6 +99,9 @@ def simplify_pymbolic_expression(e):
         # may involve nodes that have no sympy equivalent (SumfactKernel...)
         return e
     else:
-        sympyexpr = MyPymbolicToSympyMapper()(e)
+        forward = MyPymbolicToSympyMapper()
+        backward = MySympyToPymbolicMapper()
+
+        sympyexpr = forward(e)
         simplified = sp.simplify(sympyexpr)
-        return MySympyToPymbolicMapper()(simplified)
+        return backward(simplified)
-- 
GitLab