Chris, can you explain what's going on in Add._eval_expand_mul?  This
is breaking the pattern of all the other do-nothing _eval_expand
functions, and I don't understand what it's supposed to be doing.  Is
this a hack, or do you think all such noop functions should be written
this way?

The relevant commit is 6b892e98.

Aaron Meurer

On Mon, Jul 16, 2012 at 7:34 PM, Aaron Meurer <[email protected]> wrote:
> I think I figured out the cause of this.  Some expand methods are
> calling expand to do deep=True recursion. For example,
> Pow._eval_expand_power_exp().  This results in the hints being called
> recursively indefinitely.
>
> I think each hint should only call itself recursively.  I'll try to
> make this change and see if it doesn't break anything.
>
> Aaron Meurer
>
> On Mon, Jul 16, 2012 at 7:23 PM, Aaron Meurer <[email protected]> wrote:
>> I've been looking into the test_expand() memory leak (e.g., with
>> PYTHONHASHSEED=2538990509). Apparently, the problem is not with cse,
>> but with expand.  If you put a print statement in expr.py like
>>
>> diff --git a/sympy/core/expr.py b/sympy/core/expr.py
>> index 2a2ae16..38bffcf 100644
>> --- a/sympy/core/expr.py
>> +++ b/sympy/core/expr.py
>> @@ -2645,6 +2645,7 @@ def expand(self, deep=True, modulus=None,
>> power_base=True, power_exp=True, \
>>              return n.expand(deep=deep, modulus=modulus, **hints)/d
>>          for hint, use_hint in hints.iteritems():
>>              if use_hint:
>> +                print 'expanding %s' % hint
>>                  func = getattr(expr, '_eval_expand_'+hint, None)
>>                  if func is not None:
>>                      expr = func(deep=deep, **hints)
>>
>> and run the tests with PYTHONHASHSEED=2538990509 (64-bit), you'll get
>>
>> ...
>> expanding mul
>> expanding log
>> expanding basic
>> expanding power_exp
>> expanding power_base
>> expanding multinomial
>> expanding mul
>> expanding log
>> expanding basic
>> expanding power_exp
>> expanding power_base
>> expanding multinomial
>> expanding mul
>> expanding log
>> expanding basic
>> expanding power_exp
>> expanding power_base
>> expanding multinomial
>> expanding mul
>> expanding log
>> expanding basic
>> expanding power_exp
>> expanding power_base
>> expanding multinomial
>> expanding mul
>> expanding log
>> expanding basic
>> expanding power_exp
>> expanding power_base
>> ...
>>
>> and so on, infinitely.  Clearly somewhere is not handling the base
>> case of recursion correctly, but solving this more generally should
>> take care of the problem as well.
>>
>> Aaron Meurer

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

Reply via email to