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 292 292 elif isinstance(digraph, DiGraph): 293 293 elements = digraph.vertices() 294 294 self._elements = elements 295 self._hash = None 295 296 296 297 # This defines the type (class) of elements of poset. 297 298 _element_type = PosetElement 298 299 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): 300 318 r""" 301 Define comparisonfor finite posets.319 Define equality for finite posets. 302 320 303 We compare types, then number ofelements, then Hasse321 We test equality of types, then number of elements and elements, then Hasse 304 322 diagrams. 305 323 306 324 TESTS:: … … 310 328 sage: Q = Poset([[1,2],[],[1]]) 311 329 sage: Q == P 312 330 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]] 317 340 """ 318 341 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 322 344 else: 323 return len(self._elements) - len(other._elements)345 return False 324 346 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)) 326 370 327 371 def _element_to_vertex(self,x): 328 372 """
