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
-~----------~----~----~----~------~----~------~--~---

Reply via email to