You can use your example below as a test.  Also, you could try putting  
a print statement on line 733 to see what tests use it and modify them  
to use negative exponents (by the way, looking at the code, it looks  
like someone just miscopied it.  Line 735 should match line 733, but  
it instead matches 742).

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

> I would be glad to, but I think I need to understand the code better  
> to write a valid test.  Should that line get executed any time there  
> is 1/term in the experssion?
>
> On Mon, Sep 7, 2009 at 12:32 PM, Aaron S. Meurer  
> <asmeu...@gmail.com> wrote:
>
> 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