Status: Accepted
Owner: ----
Labels: Type-Defect Priority-High

New issue 1527 by ondrej.certik: bug in the printer (function + subs)
http://code.google.com/p/sympy/issues/detail?id=1527

In [1]: F = Function('F')

In [2]: x, y, t = symbols('x y t')

In [3]: a = Symbol('a', Real=True)

In [4]: eq = Derivative(F(x, t), x)

In [5]: eq
Out[5]:
d
──(F(x, t))
dx

In [6]: pat = -33*t*x + F(x + exp(-t))

In [7]: pat
Out[7]:
            ⎛     -t⎞
-33⋅t⋅x + F⎝x + ℯ  ⎠

In [8]: sub = eq.subs(F(x, t), pat)

In [9]: sub
Out[9]:
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

/home/ondrej/repos/sympy/<ipython console> in <module>()

/home/ondrej/usr/lib/python/IPython/Prompts.pyc in __call__(self, arg)
     550
     551             # and now call a possibly user-defined print mechanism

--> 552             manipulated_val = self.display(arg)
     553
     554             # user display hooks can change the variable to be
stored in


/home/ondrej/usr/lib/python/IPython/Prompts.pyc in _display(self, arg)
     576             return IPython.generics.result_display(arg)
     577         except TryNext:
--> 578             return self.shell.hooks.result_display(arg)
     579
     580     # Assign the default display method:


/home/ondrej/usr/lib/python/IPython/hooks.pyc in __call__(self, *args, **kw)
     137             #print "prio",prio,"cmd",cmd #dbg

     138             try:
--> 139                 ret = cmd(*args, **kw)
     140                 return ret
     141             except ipapi.TryNext, exc:

/home/ondrej/repos/sympy/sympy/interactive/__init__.pyc in
result_display(self, arg)
      24                 """
      25                 if self.rc.pprint:
---> 26                     out = stringify_func(arg)
      27
      28                     if '\n' in out:

/home/ondrej/repos/sympy/<input> in <lambda>(arg)

/home/ondrej/repos/sympy/sympy/printing/pretty/pretty.pyc in pretty(expr,
profile, **kargs)
     610     try:
     611         pp = PrettyPrinter(profile)
--> 612         return pp.doprint(expr)
     613     finally:
     614         pretty_use_unicode(uflag)

/home/ondrej/repos/sympy/sympy/printing/pretty/pretty.pyc in doprint(self,
expr)
      29
      30     def doprint(self, expr):
---> 31         return self._print(expr).render(**self._settings)
      32
      33     # empty op so _print(stringPict) returns the same


/home/ondrej/repos/sympy/sympy/printing/printer.pyc in _print(self, expr,
*args)
     212                 printmethod = '_print_' + cls.__name__
     213                 if hasattr(self, printmethod):
--> 214                     res = getattr(self, printmethod)(expr, *args)
     215                     if res is None:
     216                         raise RuntimeError("Printing method '%s'
did return None"%\

/home/ondrej/repos/sympy/sympy/printing/pretty/pretty.pyc in
_print_Add(self, sum)
     401     def _print_Add(self, sum):
     402         args = list(sum.args)
--> 403         args.sort(Basic._compare_pretty)
     404         pforms = []
     405         for x in args:

/home/ondrej/repos/sympy/sympy/core/basic.pyc in _compare_pretty(a, b)
     531         # because 1 = x^0, but 0 2 3 4 ... = x^1

     532         p1, p2, p3 = Wild("p1"), Wild("p2"), Wild("p3")
--> 533         r_a = a.match(p1 * p2**p3)
     534         r_b = b.match(p1 * p2**p3)
     535         if r_a is not None and r_b is not None:

/home/ondrej/repos/sympy/sympy/core/basic.pyc in match(self, pattern)
    1432         """
    1433         pattern = sympify(pattern)
-> 1434         return pattern.matches(self, {})
    1435
    1436     def solve4linearsymbol(eqn, rhs, symbols = None):

/home/ondrej/repos/sympy/sympy/core/mul.pyc in matches(pattern, expr,
repl_dict, evaluate)
     549         expr = sympify(expr)
     550         if pattern.is_commutative and expr.is_commutative:
--> 551             return AssocOp._matches_commutative(pattern, expr,
repl_dict, evaluate)
     552         # todo for commutative parts, until then use the default
matches method for non-commutative products

     553         return Basic.matches(pattern, expr, repl_dict, evaluate)

/home/ondrej/repos/sympy/sympy/core/operations.pyc in
_matches_commutative(pattern, expr, repl_dict, evaluate)
     134                 d1 = w.matches(last_op, repl_dict)
     135                 if d1 is not None:
--> 136                     d2 = pattern.matches(expr, d1, evaluate=True)
     137                     if d2 is not None:
     138                         return d2

/home/ondrej/repos/sympy/sympy/core/mul.pyc in matches(pattern, expr,
repl_dict, evaluate)
     549         expr = sympify(expr)
     550         if pattern.is_commutative and expr.is_commutative:
--> 551             return AssocOp._matches_commutative(pattern, expr,
repl_dict, evaluate)
     552         # todo for commutative parts, until then use the default
matches method for non-commutative products

     553         return Basic.matches(pattern, expr, repl_dict, evaluate)

/home/ondrej/repos/sympy/sympy/core/operations.pyc in
_matches_commutative(pattern, expr, repl_dict, evaluate)
      94             pat = pattern
      95             for old,new in repl_dict.items():
---> 96                 pat = pat.subs(old, new)
      97             if pat != pattern:
      98                 return pat.matches(expr, repl_dict)

/home/ondrej/repos/sympy/sympy/core/basic.pyc in subs(self, *args)
    1037         elif len(args) == 2:
    1038             old, new = args
-> 1039             return self._subs_old_new(old, new)
    1040         else:
    1041             raise TypeError("subs accepts either 1 or 2 arguments")

/home/ondrej/repos/sympy/sympy/core/cache.pyc in wrapper(*args, **kw_args)
      83         except KeyError:
      84             pass
---> 85         func_cache_it_cache[k] = r = func(*args, **kw_args)
      86         return r
      87

/home/ondrej/repos/sympy/sympy/core/basic.pyc in _subs_old_new(self, old,  
new)
    1046         old = sympify(old)
    1047         new = sympify(new)
-> 1048         return self._eval_subs(old, new)
    1049
    1050     def _eval_subs(self, old, new):

/home/ondrej/repos/sympy/sympy/core/mul.pyc in _eval_subs(self, old, new)
     752                 ret_set = self_set - old_set
     753                 return Mul(new, coeff_self/coeff_old,
*[s._eval_subs(old, new) for s in ret_set])
--> 754         return self.__class__(*[s._eval_subs(old, new) for s in
self.args])
     755
     756     def _eval_nseries(self, x, x0, n):

/home/ondrej/repos/sympy/sympy/core/power.pyc in _eval_subs(self, old, new)
     213             coeff2,terms2 = (self.exp *
C.log(self.base)).as_coeff_terms()
     214             if terms1==terms2: return new ** (coeff1/coeff2) #
(x**(2*y)).subs(exp(3*y*log(x)),z) -> z**(2/3*y)
--> 215         return self.base._eval_subs(old, new) **
self.exp._eval_subs(old, new)
     216
     217     def as_powers_dict(self):

/home/ondrej/repos/sympy/sympy/core/function.pyc in _eval_subs(self, old,  
new)
     617         if self==old:
     618             return new
--> 619         return Derivative(*map(lambda x: x._eval_subs(old, new),
self.args), **{'evaluate': True})
     620
     621     def matches(pattern, expr, repl_dict={}, evaluate=False):

/home/ondrej/repos/sympy/sympy/core/function.pyc in __new__(cls, expr,
*symbols, **assumptions)
     576             s = sympify(s)
     577             if not isinstance(s, Symbol):
--> 578                 raise ValueError('Invalid literal: %s is not a
valid variable' % s)
     579             if not expr.has(s):
     580                 return S.Zero

ValueError: Invalid literal: x + exp(-t) is not a valid variable


--
You received this message because you are listed in the owner
or CC fields of this issue, or because you starred this issue.
You may adjust your issue notification preferences at:
http://code.google.com/hosting/settings

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sympy-issues" group.
To post to this group, send email to sympy-issues@googlegroups.com
To unsubscribe from this group, send email to 
sympy-issues+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sympy-issues?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to