Ticket #14535: trac14535-immutable_graphs_vb.patch
File trac14535-immutable_graphs_vb.patch, 8.9 KB (added by , 8 years ago) |
---|
-
sage/combinat/posets/hasse_diagram.py
# HG changeset patch # User Simon King <simon.king@uni-jena.de> # Date 1367834112 -7200 # Node ID 4efe495aa3ef4fd0d1c2d30675846f3973d54ff3 # Parent aa7aca259cdd74c051c7e0ce0414f753fce2b6cd Mutability for graphs diff --git a/sage/combinat/posets/hasse_diagram.py b/sage/combinat/posets/hasse_diagram.py
a b 46 46 Hasse diagram of a poset containing 4 elements 47 47 sage: TestSuite(H).run() 48 48 """ 49 def __init__(self, *args, **kwds): 50 """ 51 Hasse diagrams are immutable digraphs, which is made sure here. 49 52 50 # Hasse diagrams are immutable. This temporary hack enables the 51 # __hash__ method of DiGraph 52 _immutable = True 53 EXAMPLES:: 54 55 sage: from sage.combinat.posets.hasse_diagram import HasseDiagram 56 sage: H = HasseDiagram({0:[1,2],1:[3],2:[3],3:[]}) 57 sage: D = {H:1} # indirect doctest 58 sage: D 59 {Hasse diagram of a poset containing 4 elements: 1} 60 61 """ 62 DiGraph.__init__(self, *args, **kwds) 63 # Hasse diagrams are immutable. 64 self.set_immutable() 53 65 54 66 def _repr_(self): 55 67 r""" 56 68 TESTS:: 69 57 70 sage: from sage.combinat.posets.hasse_diagram import HasseDiagram 58 71 sage: H = HasseDiagram({0:[1,2],1:[3],2:[3],3:[]}) 59 72 sage: H._repr_() -
sage/geometry/polyhedron/base.py
diff --git a/sage/geometry/polyhedron/base.py b/sage/geometry/polyhedron/base.py
a b 3077 3077 sage: s4.is_eulerian() 3078 3078 True 3079 3079 """ 3080 return Graph(self.vertex_adjacency_matrix(), loops=True) 3080 G = Graph(self.vertex_adjacency_matrix(), loops=True) 3081 G.set_immutable() 3082 return G 3081 3083 3082 3084 graph = vertex_graph 3083 3085 -
sage/graphs/bipartite_graph.py
diff --git a/sage/graphs/bipartite_graph.py b/sage/graphs/bipartite_graph.py
a b 33 33 #***************************************************************************** 34 34 35 35 from graph import Graph 36 from sage.structure.mutability import require_mutable 36 37 37 38 class BipartiteGraph(Graph): 38 39 r""" … … 420 421 else: 421 422 return "".join(["Bipartite ", s]) 422 423 424 @require_mutable 423 425 def add_vertex(self, name=None, left=False, right=False): 424 426 """ 425 427 Creates an isolated vertex. If the vertex already exists, then … … 515 517 516 518 return retval 517 519 520 @require_mutable 518 521 def add_vertices(self, vertices, left=False, right=False): 519 522 """ 520 523 Add vertices to the bipartite graph from an iterable container of … … 608 611 609 612 return 610 613 614 @require_mutable 611 615 def delete_vertex(self, vertex, in_order=False): 612 616 """ 613 617 Deletes vertex, removing all incident edges. Deleting a non-existent … … 677 681 raise RuntimeError( 678 682 "Vertex (%s) not found in partitions" % vertex) 679 683 684 @require_mutable 680 685 def delete_vertices(self, vertices): 681 686 """ 682 687 Remove vertices from the bipartite graph taken from an iterable … … 721 726 raise RuntimeError( 722 727 "Vertex (%s) not found in partitions" % vertex) 723 728 729 @require_mutable 724 730 def add_edge(self, u, v=None, label=None): 725 731 """ 726 732 Adds an edge from ``u`` and ``v``. -
sage/graphs/generic_graph.py
diff --git a/sage/graphs/generic_graph.py b/sage/graphs/generic_graph.py
a b 308 308 from sage.rings.rational import Rational 309 309 from generic_graph_pyx import GenericGraph_pyx, spring_layout_fast 310 310 from sage.graphs.dot2tex_utils import assert_have_dot2tex 311 from sage.structure.mutability import require_mutable 311 312 312 313 class GenericGraph(GenericGraph_pyx): 313 314 """ … … 460 461 return False 461 462 return True 462 463 463 def __hash__(self):464 """465 Since graphs are mutable, they should not be hashable, so we return466 a type error.467 468 EXAMPLES::469 470 sage: hash(Graph())471 Traceback (most recent call last):472 ...473 TypeError: graphs are mutable, and thus not hashable474 """475 if getattr(self, "_immutable", False):476 return hash((tuple(self.vertices()), tuple(self.edges())))477 raise TypeError("graphs are mutable, and thus not hashable")478 479 464 def __mul__(self, n): 480 465 """ 481 466 Returns the sum of a graph with itself n times. … … 784 769 setattr(G, attr, copy(old_attr)) 785 770 786 771 G._weighted = self._weighted 772 G._is_immutable = False 787 773 return G 788 774 789 775 copy = __copy__ … … 7449 7435 7450 7436 7451 7437 ### Vertex handlers 7452 7438 @require_mutable 7453 7439 def add_vertex(self, name=None): 7454 7440 """ 7455 7441 Creates an isolated vertex. If the vertex already exists, then … … 7485 7471 """ 7486 7472 return self._backend.add_vertex(name) 7487 7473 7474 @require_mutable 7488 7475 def add_vertices(self, vertices): 7489 7476 """ 7490 7477 Add vertices to the (di)graph from an iterable container of … … 7522 7509 """ 7523 7510 return self._backend.add_vertices(vertices) 7524 7511 7512 @require_mutable 7525 7513 def delete_vertex(self, vertex, in_order=False): 7526 7514 """ 7527 7515 Deletes vertex, removing all incident edges. Deleting a … … 7584 7572 7585 7573 self._backend.del_vertex(vertex) 7586 7574 7575 @require_mutable 7587 7576 def delete_vertices(self, vertices): 7588 7577 """ 7589 7578 Remove vertices from the (di)graph taken from an iterable container … … 8149 8138 8150 8139 8151 8140 ### Edge handlers 8152 8141 @require_mutable 8153 8142 def add_edge(self, u, v=None, label=None): 8154 8143 """ 8155 8144 Adds an edge from u and v. … … 8403 8392 for e in edges: 8404 8393 self.subdivide_edge(e, k) 8405 8394 8395 @require_mutable 8406 8396 def delete_edge(self, u, v=None, label=None): 8407 8397 r""" 8408 8398 Delete the edge from u to v, returning silently if vertices or edge … … 8555 8545 else: 8556 8546 self.delete_edge(u, v) 8557 8547 8548 @require_mutable 8558 8549 def set_edge_label(self, u, v, l): 8559 8550 """ 8560 8551 Set the edge label of a given edge. -
sage/graphs/generic_graph_pyx.pxd
diff --git a/sage/graphs/generic_graph_pyx.pxd b/sage/graphs/generic_graph_pyx.pxd
a b 5 5 cdef run_spring(int, int, double*, int*, int, bint) 6 6 7 7 cdef class GenericGraph_pyx(SageObject): 8 pass 9 10 8 cdef public bint _is_immutable 11 9 12 10 cdef class SubgraphSearch: 13 11 cdef int ng -
sage/graphs/generic_graph_pyx.pyx
diff --git a/sage/graphs/generic_graph_pyx.pyx b/sage/graphs/generic_graph_pyx.pyx
a b 29 29 double sqrt(double) 30 30 31 31 cdef class GenericGraph_pyx(SageObject): 32 pass 32 33 def set_immutable(self): 34 """ 35 Make sure that this graph can't be changed. 36 37 EXAMPLES:: 38 39 sage: G = Graph() 40 sage: G.is_mutable() 41 True 42 sage: G.add_edge((1,2), label='alpha') 43 sage: G.set_immutable() 44 sage: G.add_edge((3,1), label='beta') 45 Traceback (most recent call last): 46 ... 47 ValueError: <class 'sage.graphs.graph.Graph'> instance is 48 immutable, <function add_edge at ...> must not be called 49 """ 50 self._is_immutable = True 51 52 def is_immutable(self): 53 """ 54 Test whether this graph is immutable. 55 56 EXAMPLES:: 57 58 sage: G = Graph() 59 sage: G.is_immutable() 60 False 61 sage: G.add_edge((1,2), label='alpha') 62 sage: G.set_immutable() 63 sage: G.is_immutable() 64 True 65 """ 66 return self._is_immutable 67 68 def is_mutable(self): 69 """ 70 Test whether this graph can be changed. 71 72 EXAMPLES:: 73 74 sage: G = Graph() 75 sage: G.is_mutable() 76 True 77 sage: G.add_edge((1,2), label='alpha') 78 sage: G.set_immutable() 79 sage: G.is_mutable() 80 False 81 """ 82 return not self._is_immutable 83 84 def __hash__(self): 85 """ 86 Since graphs are mutable, they should not be hashable, so we return 87 a type error. 88 89 EXAMPLES:: 90 91 sage: G = Graph() 92 sage: hash(G) 93 Traceback (most recent call last): 94 ... 95 TypeError: This graph is mutable, and thus not hashable 96 sage: G.set_immutable() 97 sage: hash(G) 98 107815166986306181 99 100 """ 101 if self._is_immutable: 102 return hash((tuple(self.vertices()), tuple(self.edges()))) 103 raise TypeError, "This graph is mutable, and thus not hashable" 33 104 34 105 def spring_layout_fast_split(G, **options): 35 106 """