From 6b53cbbb68971e3e8cea7950e86f0d55925a3b25 Mon Sep 17 00:00:00 2001
From: Jean-Baptiste Keck <Jean-Baptiste.Keck@imag.fr>
Date: Tue, 17 Jul 2018 23:29:01 +0200
Subject: [PATCH] fix symbolic for sympy v1.2

---
 hysop/core/graph/graph_builder.py               |  3 ---
 hysop/operator/base/custom_symbolic_operator.py | 12 +++++++-----
 hysop/operator/directional/symbolic_dir.py      |  2 ++
 hysop/symbolic/directional.py                   |  8 ++++++--
 4 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/hysop/core/graph/graph_builder.py b/hysop/core/graph/graph_builder.py
index 238d4eefd..fb7eaff3a 100644
--- a/hysop/core/graph/graph_builder.py
+++ b/hysop/core/graph/graph_builder.py
@@ -564,9 +564,6 @@ class GraphBuilder(object):
         operators     = reduced_graph.vertex_properties['operators']
         nodes = [ operators[reduced_graph.vertex(vid)] for vid in self.sorted_nodes ]
         return nodes
-        import sys
-        sys.exit(1)
-
         
     def build_subgraph(self, node, current_level, **kwds):
         node_ops = []
diff --git a/hysop/operator/base/custom_symbolic_operator.py b/hysop/operator/base/custom_symbolic_operator.py
index 131b4da79..e287b978c 100644
--- a/hysop/operator/base/custom_symbolic_operator.py
+++ b/hysop/operator/base/custom_symbolic_operator.py
@@ -496,7 +496,7 @@ class SymbolicExpressionParser(object):
                 else:
                     array = lhs
             elif isinstance(lhs, sm.Derivative):
-                _vars = lhs.args[1:]
+                _vars = tuple(v[0] for v in lhs.args[1:] for _ in xrange(v[1]))
                 _t    = time_symbol
                 unique_vars = set(_vars)
                 if isinstance(lhs.args[0], AppliedSymbolicField):
@@ -855,7 +855,7 @@ class SymbolicExpressionParser(object):
                                                                 field=field, _register=False)}
         elif isinstance(expr, sm.Derivative):
             dexpr = expr.args[0]
-            dvars = expr.args[1:]
+            dvars = tuple(v[0] for v in expr.args[1:] for _ in xrange(v[1]))
             unique_dvars = set(dvars)
             invalid_dvars = (unique_dvars - set(space_symbols) - set([time_symbol]))
             if invalid_dvars:
@@ -902,7 +902,8 @@ class SymbolicExpressionParser(object):
         elif isinstance(expr, Assignment):
             lhs, rhs = expr.args
             if isinstance(lhs, sm.Derivative):
-                assert lhs.args[1] == time_symbol
+                assert lhs.args[1][0] == time_symbol
+                assert lhs.args[1][1] == 1
                 assert len(lhs.args)==2
                 lhs = lhs.args[0]
             freqs = cls._extract_obj_requirements(info, rhs)
@@ -960,7 +961,8 @@ class SymbolicExpressionParser(object):
             func = expr.func
         elif isinstance(lhs, sm.Derivative):
             assert isinstance(lhs.args[0], AppliedSymbolicField)
-            assert lhs.args[1] == time_symbol
+            assert lhs.args[1][0] == time_symbol
+            assert lhs.args[1][1] == 1
             assert len(lhs.args)==2
             lhs = lhs.args[0]
             assert expr.func is Assignment
@@ -1023,7 +1025,7 @@ class SymbolicExpressionParser(object):
             return dfield.s[index], di
         elif isinstance(expr, sm.Derivative):
             dexpr = expr.args[0]
-            dvars = expr.args[1:]
+            dvars = tuple(v[0] for v in expr.args[1:] for _ in xrange(v[1]))
             unique_dvars = set(dvars)
             invalid_dvars = (unique_dvars - set(space_symbols))
             direction = info.direction
diff --git a/hysop/operator/directional/symbolic_dir.py b/hysop/operator/directional/symbolic_dir.py
index 1a8a85ab6..73d019392 100644
--- a/hysop/operator/directional/symbolic_dir.py
+++ b/hysop/operator/directional/symbolic_dir.py
@@ -120,8 +120,10 @@ class DirectionalSymbolic(DirectionalOperatorFrontend):
         else:
             directional_exprs = {}
             for e, fixed_res, forced_res in zip(exprs, fixed_residue, force_residue):
+                print 'SPLITTING EXPR:', e
                 se = split_assignement(e, fixed_res, forced_res, None)
                 for (k,v) in se.iteritems():
+                    print 'DIR={}, EXPR={}'.format(k,v)
                     if (v==0):
                         continue
                     if (k in directional_exprs):
diff --git a/hysop/symbolic/directional.py b/hysop/symbolic/directional.py
index 924b5ae55..7ce51e8bb 100644
--- a/hysop/symbolic/directional.py
+++ b/hysop/symbolic/directional.py
@@ -17,8 +17,11 @@ def collect_direction(expr, var):
         args = ()
         if isinstance(expr, sm.Symbol):
             return expr
-        elif isinstance(expr, sm.Derivative) and set(expr.args[1:]) != set((var,)):
-            return 0
+        elif isinstance(expr, sm.Derivative):
+            if (set(a[0] for a in expr.args[1:] if a[1]>=1) != set((var,))):
+                return 0
+            else:
+                return expr
         elif isinstance(expr, (sm.Number, int, float)):
             return expr
         elif isinstance(expr, sm.Expr):
@@ -36,6 +39,7 @@ def split(F, fixed_residue, force_residue, coords):
     if isinstance(F, Assignment):
         msg='Expression cannot be of type Assignment: {}'.format(F)
         raise TypeError(msg)
+    print 'SPLIT {} with FIXED_RESIDUE={} and FORCE_RESIDUE={}'.format(F, fixed_residue, force_residue)
     res = {}
     coords = first_not_None(coords, space_symbols)
     for i, xi in enumerate(coords):
-- 
GitLab