If you run the coverage script in bin/, you will find that that line  
is not covered by the test suite, so it is quite possible that it is  
wrong.  Indeed, if I make the change you specify, the tests still all  
pass.  Could you create a patch that fixes it and includes a test?

Aaron Meurer
On Sep 7, 2009, at 11:23 AM, Ryan Krauss wrote:

> I think I have stumbled onto a bug in core/mul/_eval_subs.
>
> I have the following expression:
> In [103]: temp
> Out[103]: c3*L**2/(EI*beta**2)
>
> and am trying to substitute a = L**2/EI:
>
> In [104]: temp.subs(L**2/EI, a)
>
> which produces the following traceback:
>
> /home/ryan/git/sympy/sympy/core/mul.pyc in _eval_subs(self, old, new)
>     733                     for i in range(o.exp): otemp.append 
> (o.base)
>     734                 elif o.exp.is_negative:
> --> 735                     for i in range(abs(o.exp)): otemp.append 
> (1/s.base)
>     736             else: otemp.append(o)
>     737         for s in terms_self:
>
> UnboundLocalError: local variable 's' referenced before assignment
>
> I have not put a lot of effort into disecting the code, but from the  
> context it seems like 1/s.base in line 735 should be changed to 1/ 
> o.base:
>
>         # break up powers, i.e., x**2 -> x*x
>         otemp, stemp = [], []
>         for o in terms_old:
>             if isinstance(o,Pow) and isinstance(o.exp, Integer):
>                 if o.exp.is_positive:
>                     for i in range(o.exp): otemp.append(o.base)
>                 elif o.exp.is_negative:
>                     for i in range(abs(o.exp)): otemp.append(1/ 
> s.base)#this is line 735
>             else: otemp.append(o)
>         for s in terms_self:
>             if isinstance(s,Pow) and isinstance(s.exp, Integer):
>                 if s.exp.is_positive:
>                     for i in range(s.exp): stemp.append(s.base)
>                 elif s.exp.is_negative:
>                     for i in range(abs(s.exp)): stemp.append(1/s.base)
>             else: stemp.append(s)
>         terms_old = otemp
>         terms_self = stemp
>
>
> Making this change leads to the expected result:
>
> In [5]: temp
> Out[5]: c3*L**2/(EI*beta**2)
>
> In [6]: temp.subs(L**2/EI, a)
> Out[6]: a*c3/beta**2
>
>
> Am I thinking correctly here?
>
> Ryan
>
>
> >


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

Reply via email to