On Saturday, 25 January 2014 19:55:58 UTC+1, Aaron Meurer wrote: > > Well in theory it's easy. You just need to edit the exclude part of > the iterable definition in sympy/core/compatiblity.py to include > IndexedBase. But this is actually not so easy because there's no way > to import IndexedBase for use in the function, since it is used in the > import process before IndexedBase is defined.
Yeah I ran into that problem, but iterable takes `exclude` kwarg so I tried: iterable(expr, exclude=(string_types, dict, IndexedBase)) based on what you said about IndexedBase needing to be added to the list then there is no infinite loop anymore but the output is not what one would expect: ([(x0, y), (x1, i), (x2, x1 + 1), (x3, x), (x4, (-x3[x1] + x3[x2])**(-1))], [x4*(-x0[x1] + x0[x2]), x4]) so it is actually looking for cse's in indices which is maybe a bit overkill.. But apart from that it acutally works! > > So probably what should be done is some kind of _not_iterable property > put on IndexedBase and iterable() changed to look for it. > > By the way, I think there are other objects that do the same sort of > thing, like MatrixSymbol, which also need to be disabled, since they > iterate forever. I seem to remember a few places in the code just > check for them explicitly, but we should standardize on iterable(), > and make iterable() know what does and doesn't work. > Makes sense, I don't nearly have the overview to know what should be excluded (and if there are exceptions for certain applications). So maybe passing modified exclude kwarg is a good workaround for now? Making it not look into the indices would be nice though. > > Aaron Meurer > > > On Sat, Jan 25, 2014 at 12:45 PM, Björn Dahlgren > <[email protected]<javascript:>> > wrote: > > Ok, I poked around a little didn't get it to work on my first try. > > Do you agree that it would be the preferred behaviour that cse should > work > > with Indexed instances out of the box? > > Is it trivial fix for someone - if not I could try to get this to work > but > > it will take me quite a bit of work I think. > > > > Thanks! > > /Björn > > > > > > On Saturday, 25 January 2014 19:26:47 UTC+1, Aaron Meurer wrote: > >> > >> The problem is that the iterable() function in compatibility thinks > >> that y is iterable, so it's trying to iterate through y. The fix is to > >> add IndexedBase to the set of ignored iterables in the function. > >> > >> Aaron Meurer > >> > >> On Sat, Jan 25, 2014 at 5:04 AM, Björn Dahlgren <[email protected]> > wrote: > >> > Hi! > >> > > >> > while using the Indexed class from sympy.tensor I have run into the > >> > following problem: > >> > > >> > cse(...) fails for expressions having "Indexed" instances. They are > not > >> > handled correctly in opt_cse() in cse_main.py > >> > A possible work-around is to substitute the Indexed instances with > >> > dummies, > >> > perform the CSE elimination and then > >> > resubstitute the dummies for the indexed symbols. But this is not > pretty > >> > and > >> > I think that cse(...) should handle this > >> > on its own. > >> > > >> > Example: > >> > > >> > from sympy import * > >> > > >> > len_y = 5 > >> > y = IndexedBase('y', shape=(len_y,)) > >> > x = IndexedBase('x', shape=(len_y,)) > >> > Dy = IndexedBase('Dy', shape=(len_y-1,)) > >> > i = Idx('i', len_y-1) > >> > > >> > expr1 = (y[i+1]-y[i])/(x[i+1]-x[i]) > >> > expr2 = 1/(x[i+1]-x[i]) > >> > print(cse([expr1, expr2])) > >> > > >> > this will cause an infinite recursive call stack to _find_opts > raising: > >> > RuntimeError: maximum recursion depth exceeded in > __instancecheck__ > >> > > >> > > >> > Does anybody know what the best approach here would be? Add something > to > >> > the > >> > Indexed class or modify > >> > opt_cse? > >> > > >> > Best regards > >> > /Björn > >> > > >> > -- > >> > 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] <javascript:>. > > To post to this group, send email to [email protected]<javascript:>. > > > 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.
