On Sun, Sep 15, 2013 at 1:38 AM, Angus Griffith <[email protected]> wrote:
> In order to represent (and modify) a sympy expression within Mathics we've
> been using the following:
>
> BasicSympy = sympy.Expr
>
> class SympyExpression(BasicSympy):
> is_Function = True
> nargs = None
>
> def __new__(cls, expr):
> obj = BasicSympy.__new__(
> cls, *(expr.head.to_sympy(),) + tuple(leaf.to_sympy()
> for leaf in expr.leaves))
> obj.expr = expr
> return obj
>
> @property
> def func(self):
> class SympyExpressionFunc(object):
> def __new__(cls, *args):
> return SympyExpression(self.expr)
> return SympyExpressionFunc
This is unrelated, but you should be careful defining a class inside a
function. Every time this function is run, a new class called
SympyExpressionFunc will be created.
>
> def has_any_symbols(self, *syms):
> result = any(arg.has_any_symbols(*syms) for arg in self.args)
> return result
>
> def _eval_subs(self, old, new):
> if self == old:
> return new
> old, new = from_sympy(old), from_sympy(new)
> old_name = old.get_name()
> if old_name:
> new_expr = self.expr.replace_vars({old_name: new})
> return SympyExpression(new_expr)
> return self
>
> def _eval_rewrite(self, pattern, rule, **hints):
> return self
>
> @property
> def is_commutative(self):
> if all(getattr(t, 'is_commutative') for t in self.args):
> return True
> else:
> return False
>
> def __str__(self):
> return '%s[%s]' % (super(SympyExpression, self).__str__(),
> self.expr)
>
>
> The problem is that sympy.expr._expand_hint has been modified to create a
> new sympy.Expr instance (line 2808 of sympy/core/expr.py) rather than using
> func. Because SympyExpression overrides __new__ to only accept one argument,
> this raises an error.
>
> My original thought was to modify SympyExpression (e.g. a factory that does
> some monkey-patching on sympy.Expr), but asmeurer told me that the
> implementation in sympy.Expr._expand_hint is wrong.
>
> Should we revert some of the changes in commit
> 4b7c2b8199322d8b364b97f6bd27ccaa9dc21dae?
https://github.com/sympy/sympy/pull/2454 was merged. Does that fix your problem?
Aaron Meurer
>
> --
> You received this message because you are subscribed to the Google Groups
> "sympy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sympy.
> For more options, visit https://groups.google.com/groups/opt_out.
--
You received this message because you are subscribed to the Google Groups
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.