Hi,

I'm still working on fixing up schemes/generic/morphism.py, and I'm
still having trouble with comparisons.  I have written __cmp__()
methods, but they don't seem to be called.  Here's a concrete example.
 The definition of __cmp__ for SchemeMorphism_id is below:

{{{
class SchemeMorphism_id(SchemeMorphism):
    """
    The identity morphism from `X` to itself.
    """

    def __cmp__(self, other):
        if not isinstance(other, SchemeMorphism_id):
            return cmp(type(self), type(other))

        return cmp(self.parent(), other.parent())
}}}

Now if I do

{{{
sage: X = Spec(ZZ)
sage: X.identity_morphism().parent() == X.identity_morphism().parent()
True
sage: X.identity_morphism() == X.identity_morphism()
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)

/home/ghitza/.sage/temp/artin/25555/_home_ghitza__sage_init_sage_0.py
in <module>()

/opt/sage-devel/local/lib/python2.5/site-packages/sage/structure/element.so
in sage.structure.element.Element.__richcmp__
(sage/structure/element.c:6021)()

/opt/sage-devel/local/lib/python2.5/site-packages/sage/structure/element.so
in sage.structure.element.Element._richcmp
(sage/structure/element.c:5385)()

/opt/sage-devel/local/lib/python2.5/site-packages/sage/structure/coerce.so
in sage.structure.coerce.CoercionModel_cache_maps.canonical_coercion
(sage/structure/coerce.c:7059)()

RuntimeError: BUG in map, returned None Scheme endomorphism of
Spectrum of Integer Ring
  Defn: Identity map <type 'sage.categories.morphism.CallMorphism'>
Call morphism:
  From: Set of points of Spectrum of Integer Ring defined over Integer Ring
  To:   Set of points of Spectrum of Integer Ring defined over Integer Ring
}}}


So for some reason the correct __cmp__ is not called here.  I've
tracked it down to the following comment in structure/element.pyx:

    # For a *Python* class just define __cmp__ as always.
    # But note that when this gets called you can assume that
    # both inputs have identical parents.
    #
    # If your __cmp__ methods are not getting called, verify that the
    # canonical_coercion(x,y) is not throwing errors.

The last part seems to be what's happening.  But what does that mean,
and how can I fix it?


Best,
Alex

-- 
Alex Ghitza -- Lecturer in Mathematics -- The University of Melbourne
-- Australia -- http://www.ms.unimelb.edu.au/~aghitza/

--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-devel@googlegroups.com
To unsubscribe from this group, send email to 
sage-devel-unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---

Reply via email to