Ticket #7538: trac_7538_poset_equal_fix-nb.patch

File trac_7538_poset_equal_fix-nb.patch, 3.7 KB (added by nborie, 3 years ago)
  • sage/combinat/posets/posets.py

    # HG changeset patch
    # User Nicolas Borie <nicolas.borie at math.u-psud.fr>
    # Date 1267739995 -3600
    # Node ID 075f19751b0552a449dfdf521f029eb89c7b7743
    # Parent  7da03199734a75a9ae013cda500ab506f6109ea6
    7538 fix the equality of Posets and add and __hash__ method.
    
    diff -r 7da03199734a -r 075f19751b05 sage/combinat/posets/posets.py
    a b  
    292292            elif isinstance(digraph, DiGraph): 
    293293                elements = digraph.vertices() 
    294294        self._elements = elements 
     295        self._hash = None 
    295296         
    296297    # This defines the type (class) of elements of poset. 
    297298    _element_type = PosetElement 
    298299 
    299     def __cmp__(self, other): 
     300    def __hash__(self): 
     301        """ 
     302        TESTS:: 
     303 
     304            sage: P = Poset([[1,2],[3],[3]]) 
     305            sage: P.__hash__() 
     306            6557284140853143473 # 64-bit 
     307            584755121 # 32-bit 
     308            sage: P = Poset([[1],[3],[3]]) 
     309            sage: P.__hash__() 
     310            5699294501102840900 # 64-bit 
     311            278031428 # 32-bit 
     312        """ 
     313        if self._hash is None: 
     314            self._hash = tuple(map(tuple, self.cover_relations())).__hash__() 
     315        return self._hash 
     316 
     317    def __eq__(self, other): 
    300318        r""" 
    301         Define comparison for finite posets. 
     319        Define equality for finite posets. 
    302320 
    303         We compare types, then number of elements, then Hasse 
     321        We test equality of  types, then number of elements and elements, then Hasse 
    304322        diagrams. 
    305323 
    306324        TESTS:: 
     
    310328            sage: Q = Poset([[1,2],[],[1]]) 
    311329            sage: Q == P 
    312330            False 
    313             sage: Q < P 
    314             True 
    315             sage: Q > P 
    316             False 
     331            sage: p1, p2 = Posets(2).list() 
     332            sage: p2 == p1, p1 != p2 
     333            (False, True) 
     334            sage: [[p1.__eq__(p2) for p1 in Posets(2)] for p2 in Posets(2)] 
     335            [[True, False], [False, True]] 
     336            sage: [[p2.__eq__(p1) for p1 in Posets(2)] for p2 in Posets(2)] 
     337            [[True, False], [False, True]] 
     338            sage: [[p2 == p1 for p1 in Posets(3)] for p2 in Posets(3)] 
     339            [[True, False, False, False, False], [False, True, False, False, False], [False, False, True, False, False], [False, False, False, True, False], [False, False, False, False, True]] 
    317340        """ 
    318341        if isinstance(other, type(self)): 
    319             if len(self._elements) == len(other._elements): 
    320                 return cmp(self._elements, other._elements) and \ 
    321                         cmp(self._hasse_diagram, other._hasse_diagram) 
     342            if len(self._elements) == len(other._elements) and self._elements == other._elements: 
     343                return self._hasse_diagram == other._hasse_diagram 
    322344            else: 
    323                 return len(self._elements) - len(other._elements) 
     345                return False 
    324346        else: 
    325             return cmp(type(other), type(self)) 
     347            return False 
     348 
     349    def  __ne__(self, other): 
     350        r""" 
     351        Return True if ``self`` and ``other`` are two 
     352        different posets. 
     353 
     354        TESTS:: 
     355 
     356            sage: [[p1.__ne__(p2) for p1 in Posets(2)] for p2 in Posets(2)] 
     357            [[False, True], [True, False]] 
     358            sage: P = Poset([[1,2,4],[3],[3]]) 
     359            sage: Q = Poset([[1,2],[],[1],[4]]) 
     360            sage: P != Q 
     361            True 
     362            sage: P != P 
     363            False 
     364            sage: Q != Q 
     365            False 
     366            sage: [[p1.__ne__(p2) for p1 in Posets(2)] for p2 in Posets(2)] 
     367            [[False, True], [True, False]] 
     368        """ 
     369        return (not self.__eq__(other)) 
    326370 
    327371    def _element_to_vertex(self,x): 
    328372        """