On Jul 18, 2008, at 8:05 AM, John H Palmieri wrote: > On Jul 17, 11:23 pm, Robert Bradshaw <[EMAIL PROTECTED]> > wrote: >> On Jul 17, 2008, at 10:31 PM, William Stein wrote: >> >> >> >>> On Fri, Jul 18, 2008 at 2:11 AM, John H Palmieri >>> <[EMAIL PROTECTED]> wrote: >> >>>> On Jul 17, 4:51 pm, Carl Witty <[EMAIL PROTECTED]> wrote: >>>>> On Jul 17, 3:30 pm, John H Palmieri <[EMAIL PROTECTED]> >>>>> wrote: >> >>>>>> I have several different vector space bases for an algebra A, >>>>>> and I >>>>>> have implemented this by having a class MyAlgebra, instances of >>>>>> which >>>>>> have an attribute _basis_name which is a string naming the >>>>>> basis. I >>>>>> have __cmp__ defined so that the basis is ignored: any two >>>>>> instances >>>>>> are canonically isomorphic, and there is good coercion between >>>>>> them. >> >>>>>> Now, the attribute _basis_name just affects the _repr_ and >>>>>> _latex_ >>>>>> methods for elements of the algebra; it has no other effect. My >>>>>> question is this: when I multiply elements from algebras with two >>>>>> different bases, I can't figure out how the parent of the >>>>>> result is >>>>>> determined. Some documentation suggests that the parent >>>>>> should be >>>>>> determined by the left factor, but that is not consistently >>>>>> what's >>>>>> happening. >> >>>>>> I think I would like to force the result to have the same >>>>>> parent as >>>>>> the left-hand factor, but by the time elements get to the _mul_ >>>>>> method, their parents have been changed (via coercion), so I >>>>>> can't >>>>>> find out what that parent is. (Perhaps something is getting >>>>>> cached in >>>>>> the coercion process, so things are getting coerced to the cached >>>>>> algebra, not the left-hand parent?) What should I do? Does it >>>>>> sound >>>>>> like I'm doing something wrong, and if so, what should I >>>>>> investigate? >> >>>>> Currently it's built-in to coercion that if two parents are equal, >>>>> then it doesn't matter which parent it picks. (And the >>>>> decision is >>>>> baked into various caches, etc., so the decision can depend on the >>>>> previous history of commands in this session.) >> >>>>> I've raised this issue as a problem a few weeks ago (seehttp:// >>>>> groups.google.com/group/sage-devel/browse_thread/thread/ >>>>> 4520ed...), >>>>> but nothing came of it yet. >> >>>>> Even if this gets fixed, I don't think you can fix it so that >>>>> coercion >>>>> uses the parent of the left-hand value by changing your code; this >>>>> would require changes inside the base coercion code. >> >>>> Okay, thanks. Here's something from Section 2.8 of the Sage >>>> Programming Guide: >> >>>> ARITHMETIC __add__, __mul__, ...:: When doing a binary >>>> operation, if >>>> the parents are not identical (in the sense of is ), determine if >>>> precisely one _coerce_ map is defined; if so, apply it and do the >>>> arithmetic operation. If both are defined, the parents are >>>> canonically >>>> isomorphic, so use the left one. If neither are defined, raise a >>>> TypeError. (Whether or not there is a coerce map between objects >>>> should be cached for efficiency.) >> >>>> I guess you're saying that this is wrong (the part that says "so >>>> use >>>> the left one"). >> >>> Argh. It was right when I wrote that documentation and implemented >>> the second version of the coercion model. :-) Whoever implemented >>> the third/fourth version(s) of the coercion model will I hope also >>> update the programming guide with correct statements (hint, hint >>> Robertwb). >> >> Yep, sorry. Do we want this behavior? (This could be done without too >> much trouble.) > > Given my lack of understanding of the coercion model, I'm probably not > the right person to have an opinion, but here I go anyway.
I consider the input of those *not* familiar with the model essential in judging whether or not we have done anything sane. > The absolute most important thing is that it be correctly documented. Yes, and I am working on this. I am also adding much more introspection into the model itself, like an "explain" method among other things. > After that, I would like the behavior to be predictable -- maybe I'm > imagining it, but it seems that the current behavior might depend on > the order in which various parents get cached. Yes, that is correct. When it discovers the correct common parent for a+b, it stores the result for b+a as well to save it work next time. The only case where this may be ambiguous is if there is a map both directions. > Finally, I think that > having the parent default to be the parent of the left factor (in the > situation discussed in the documentation) seems pretty innocuous and > is reasonable behavior. Yes, I'll change this. I think the coercion model should act as if it has no history (though it must cache things for speed), and this seems like the most reasonable way to break symmetry. - Robert --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to sage-devel@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sage-devel URLs: http://www.sagemath.org -~----------~----~----~----~------~----~------~--~---