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