Prasoon, Take a look at these outputs. In [5]: cs.theta.args Out[5]: ()
In [7]: cs.theta._hashable_content() Out[7]: () cs.theta.__eq__ uses Basic's .__eq__, which in turn compares _hashable_content() between the two objects. So, I think you should be using .args instead of .coord_sys and .position. On Wed, Aug 28, 2013 at 11:22 AM, Prasoon Shukla <[email protected]>wrote: > You're right. It seems to be a problem with equality checking. Here's some > code that I just ran: > > In [3]: cs.theta == cs.phi > Out[3]: True > > In [4]: cs.theta > Out[4]: cs.theta > > In [5]: cs.phi > Out[5]: cs.phi > > In [6]: id(cs.theta) > Out[6]: 169351684 > > In [7]: id(cs.phi) > Out[7]: 169350004 > > How come the == operator returns True even though the ids are different? > Also, I didn't implement __eq__ or __hash__ on BaseScalars. > > Anyway, to reproduce the problem, you can run this (I'm just pasting from > my Ipython session): > > In [1]: from sympy import *;from sympy.vector.vector import *;from > sympy.vector.integrate import *;q0, q1, q2 = symbols('q0 q1 q2');from > sympy.abc import x, y, z;c0 = CoordSysRect('c0');c1 = CoordSysRect('c1');cs > = CoordSysSph('cs') > > In [2]: cs.theta * cs.phi > Out[2]: cs.theta**2 > > Should I implement __eq__ on BaseScalar? > (I probably won't be able to respond for 7-8 hours. Going to sleep. Have > classes tomorrow morning). > > On Wednesday, August 28, 2013 10:17:39 PM UTC+5:30, Aaron Meurer wrote: > >> On Wed, Aug 28, 2013 at 7:29 AM, Prasoon Shukla >> <[email protected]> wrote: >> > I have ran into a caching problem while working on my project for the >> vector >> > calcculus module. This occurred while I was debugging the express >> method on >> > vector (this isn't really relevant though). >> > >> > So, I have a symbol theta and another symbol phi. >> > >> >>>> cs.theta >> > cs.theta >> > >> >>>> cs.phi >> > cs.phi >> > >> > cs is an instance of the CoordSysSph class (again, not really relevant >> to >> > the problem at hand). >> > >> > The problem: >> >>>> sin(cs.theta) * sin(cs.phi) >> > sin(cs.theta) ** 2 >> > >> > Well, in the definition for the cacheit decorator, the dicitionary >> > func_cache_it_cache exists. Now, when sin(cs.theta) is called, a key, >> value >> > pair gets added to the dictionary: >> > >> > ((sin, <class 'sympy.core.function.**FunctionClass'>), (cs.theta, >> <class >> > 'sympy.vector.vector.**BaseScalar'>)) : sin(cs.theta) >> > >> > Now, when SymPy needs to calculate sin(cs.phi), the cacheit decorator >> is >> > called again. The lookup key for sin(cs.phi) is generated as: >> > ((sin, <class 'sympy.core.function.**FunctionClass'>), (cs.phi, <class >> > 'sympy.vector.vector.**BaseScalar'>)) >> >> Oh, just noticed this. phi and theta are not Symbols, they are >> BaseScalars. So you probably did something wrong implementing equality >> comparison on BaseScalars. What does "cs.phi == cs.theta" give? >> >> Can you give a complete code snipped to reproduce this in your branch? >> >> Aaron Meurer >> >> > >> > At this point, the func_cache_it_cache does not have the key >> correspondind >> > to sin(cs.phi), as it shouldn't. But, here's the catch: running the >> has_key >> > method on func_cache_it_cache for this second key (for sin(cs.phi)) >> returns >> > True. That means, the cache returns sin(cs.theta). And that is what is >> > causing the problem. >> > >> > What can I possibly do here? For the time being, I am going to proceed >> with >> > the debugging. When there is a solution for this problem, we can go >> ahead >> > and fix this. >> > >> > -- >> > 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 sympy+un...@**googlegroups.com. >> > To post to this group, send email to [email protected]. >> > Visit this group at >> > http://groups.google.com/**group/sympy<http://groups.google.com/group/sympy>. >> >> > For more options, visit >> > https://groups.google.com/**groups/opt_out<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. > -- 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.
