Ticket #9567: trac_9567-networkx-1.2.patch

File trac_9567-networkx-1.2.patch, 16.0 KB (added by bedwards, 10 years ago)
  • sage/graphs/generic_graph.py

    # HG changeset patch
    # User Ben Edwards <bedwards@cs.unm.edu>
    # Date 1281372187 21600
    # Node ID 2f4945743e05e93fdbae5ec75777060bea4a6670
    # Parent  5b338f2e484f2065d3d30d47bc204d6e9ed13d12
    trac 9567: Updates to sage to interface with new version of networkx(1.2)
    
    This also includes several changes to the sage graph API to return
    keyed dictionaries instead of lists, as this is preferred in many
    situations.
    
    diff -r 5b338f2e484f -r 2f4945743e05 sage/graphs/generic_graph.py
    a b  
    84788478   
    84798479    def cluster_triangles(self, nbunch=None, with_labels=False):
    84808480        r"""
    8481         Returns the number of triangles for nbunch of vertices as an
    8482         ordered list.
     8481        Returns the number of triangles for nbunch of vertices as a
     8482        dictionary keyed by vertex.
    84838483       
    84848484        The clustering coefficient of a graph is the fraction of possible
    84858485        triangles that are triangles, `c_i = triangles_i /
     
    84948494        -  ``nbunch`` - The vertices to inspect. If
    84958495           nbunch=None, returns data for all vertices in the graph
    84968496       
    8497         -  ``with_labels`` - (boolean) default False
    8498            returns list as above True returns dict keyed by vertex labels.
    8499        
    85008497       
    85018498        REFERENCE:
    85028499
     
    85068503       
    85078504        EXAMPLES::
    85088505       
     8506            sage: (graphs.FruchtGraph()).cluster_triangles().values()
     8507            [1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0]
    85098508            sage: (graphs.FruchtGraph()).cluster_triangles()
    8510             [1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0]
    8511             sage: (graphs.FruchtGraph()).cluster_triangles(with_labels=True)
    85128509            {0: 1, 1: 1, 2: 0, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 0, 9: 1, 10: 1, 11: 0}
    85138510            sage: (graphs.FruchtGraph()).cluster_triangles(nbunch=[0,1,2])
    8514             [1, 1, 0]
     8511            {0: 1, 1: 1, 2: 0}
    85158512        """
    85168513        import networkx
    8517         return networkx.triangles(self.networkx_graph(copy=False), nbunch, with_labels)
     8514        return networkx.triangles(self.networkx_graph(copy=False), nbunch)
    85188515       
    85198516    def clustering_average(self):
    85208517        r"""
     
    85418538        import networkx
    85428539        return networkx.average_clustering(self.networkx_graph(copy=False))
    85438540       
    8544     def clustering_coeff(self, nbunch=None, with_labels=False, weights=False):
    8545         r"""
    8546         Returns the clustering coefficient for each vertex in nbunch as an
    8547         ordered list.
     8541    def clustering_coeff(self, nbunch=None, weights=False):
     8542        r"""
     8543        Returns the clustering coefficient for each vertex in nbunch as a
     8544        dictionary keyed by vertex.
    85488545       
    85498546        The clustering coefficient of a graph is the fraction of possible
    85508547        triangles that are triangles, `c_i = triangles_i /
     
    85588555        -  ``nbunch`` - the vertices to inspect (default
    85598556           None returns data on all vertices in graph)
    85608557       
    8561         -  ``with_labels`` - (boolean) default False
    8562            returns list as above True returns dict keyed by vertex labels.
    8563        
    85648558        -  ``weights`` - default is False. If both
    85658559           with_labels and weights are True, then returns a clustering
    85668560           coefficient dict and a dict of weights based on degree. Weights are
     
    85768570       
    85778571        EXAMPLES::
    85788572       
     8573            sage: (graphs.FruchtGraph()).clustering_coeff().values()
     8574            [0.33333333333333331, 0.33333333333333331, 0.0, 0.33333333333333331, 0.33333333333333331, 0.33333333333333331, 0.33333333333333331, 0.33333333333333331, 0.0, 0.33333333333333331, 0.33333333333333331, 0.0]
    85798575            sage: (graphs.FruchtGraph()).clustering_coeff()
    8580             [0.33333333333333331, 0.33333333333333331, 0.0, 0.33333333333333331, 0.33333333333333331, 0.33333333333333331, 0.33333333333333331, 0.33333333333333331, 0.0, 0.33333333333333331, 0.33333333333333331, 0.0]
    8581             sage: (graphs.FruchtGraph()).clustering_coeff(with_labels=True)
    85828576            {0: 0.33333333333333331, 1: 0.33333333333333331, 2: 0.0, 3: 0.33333333333333331, 4: 0.33333333333333331, 5: 0.33333333333333331, 6: 0.33333333333333331, 7: 0.33333333333333331, 8: 0.0, 9: 0.33333333333333331, 10: 0.33333333333333331, 11: 0.0}
    8583             sage: (graphs.FruchtGraph()).clustering_coeff(with_labels=True,weights=True)
     8577            sage: (graphs.FruchtGraph()).clustering_coeff(weights=True)
    85848578            ({0: 0.33333333333333331, 1: 0.33333333333333331, 2: 0.0, 3: 0.33333333333333331, 4: 0.33333333333333331, 5: 0.33333333333333331, 6: 0.33333333333333331, 7: 0.33333333333333331, 8: 0.0, 9: 0.33333333333333331, 10: 0.33333333333333331, 11: 0.0}, {0: 0.083333333333333329, 1: 0.083333333333333329, 2: 0.083333333333333329, 3: 0.083333333333333329, 4: 0.083333333333333329, 5: 0.083333333333333329, 6: 0.083333333333333329, 7: 0.083333333333333329, 8: 0.083333333333333329, 9: 0.083333333333333329, 10: 0.083333333333333329, 11: 0.083333333333333329})
    85858579            sage: (graphs.FruchtGraph()).clustering_coeff(nbunch=[0,1,2])
    8586             [0.33333333333333331, 0.33333333333333331, 0.0]
    8587             sage: (graphs.FruchtGraph()).clustering_coeff(nbunch=[0,1,2],with_labels=True,weights=True)
     8580            {0: 0.33333333333333331, 1: 0.33333333333333331, 2: 0.0}
     8581            sage: (graphs.FruchtGraph()).clustering_coeff(nbunch=[0,1,2],weights=True)
    85888582            ({0: 0.33333333333333331, 1: 0.33333333333333331, 2: 0.0}, {0: 0.33333333333333331, 1: 0.33333333333333331, 2: 0.33333333333333331})
    85898583        """
    85908584        import networkx
    8591         return networkx.clustering(self.networkx_graph(copy=False), nbunch, with_labels, weights)
     8585        return networkx.clustering(self.networkx_graph(copy=False), nbunch, weights)
    85928586       
    85938587    def cluster_transitivity(self):
    85948588        r"""
  • sage/graphs/graph.py

    diff -r 5b338f2e484f -r 2f4945743e05 sage/graphs/graph.py
    a b  
    25312531            sage: (graphs.ChvatalGraph()).centrality_betweenness()
    25322532            {0: 0.069696969696969688, 1: 0.069696969696969688, 2: 0.060606060606060601, 3: 0.060606060606060601, 4: 0.069696969696969688, 5: 0.069696969696969688, 6: 0.060606060606060601, 7: 0.060606060606060601, 8: 0.060606060606060601, 9: 0.060606060606060601, 10: 0.060606060606060601, 11: 0.060606060606060601}
    25332533            sage: (graphs.ChvatalGraph()).centrality_betweenness(normalized=False)
    2534             {0: 7.6666666666666661, 1: 7.6666666666666661, 2: 6.6666666666666661, 3: 6.6666666666666661, 4: 7.6666666666666661, 5: 7.6666666666666661, 6: 6.6666666666666661, 7: 6.6666666666666661, 8: 6.6666666666666661, 9: 6.6666666666666661, 10: 6.6666666666666661, 11: 6.6666666666666661}
     2534            {0: 3.833333333333333, 1: 3.833333333333333, 2: 3.333333333333333, 3: 3.333333333333333, 4: 3.833333333333333, 5: 3.833333333333333, 6: 3.333333333333333, 7: 3.333333333333333, 8: 3.333333333333333, 9: 3.333333333333333, 10: 3.333333333333333, 11: 3.333333333333333}
    25352535            sage: D = DiGraph({0:[1,2,3], 1:[2], 3:[0,1]})
    25362536            sage: D.show(figsize=[2,2])
    25372537            sage: D = D.to_undirected()
     
    25732573            1.0
    25742574        """
    25752575        import networkx
    2576         return networkx.degree_centrality(self.networkx_graph(copy=False), v)
     2576        if v==None:
     2577            return networkx.degree_centrality(self.networkx_graph(copy=False))
     2578        else:
     2579            return networkx.degree_centrality(self.networkx_graph(copy=False))[v]
    25772580           
    25782581    def centrality_closeness(self, v=None):
    25792582        r"""
     
    28702873        else:
    28712874            raise NotImplementedError("Only 'networkx' and 'cliquer' are supported.")
    28722875
    2873     def cliques_number_of(self, vertices=None, cliques=None, with_labels=False):
     2876    def cliques_number_of(self, vertices=None, cliques=None):
    28742877        """
    2875         Returns a list of the number of maximal cliques containing each
    2876         vertex. (Returns a single value if only one input vertex).
     2878        Returns a dictionary of the number of maximal cliques containing each
     2879        vertex, keyed by vertex. (Returns a single value if
     2880        only one input vertex).
    28772881       
    28782882        .. NOTE::
    28792883       
     
    28852889        -  ``vertices`` - the vertices to inspect (default is
    28862890           entire graph)
    28872891       
    2888         -  ``with_labels`` - (boolean) default False returns
    2889            list as above True returns a dictionary keyed by vertex labels
    2890        
    28912892        -  ``cliques`` - list of cliques (if already
    28922893           computed)
    28932894       
     
    28962897       
    28972898            sage: C = Graph('DJ{')
    28982899            sage: C.cliques_number_of()
    2899             [1, 1, 1, 1, 2]
     2900            {0: 1, 1: 1, 2: 1, 3: 1, 4: 2}
    29002901            sage: E = C.cliques_maximal()
    29012902            sage: E
    29022903            [[4, 0], [4, 1, 2, 3]]
    29032904            sage: C.cliques_number_of(cliques=E)
    2904             [1, 1, 1, 1, 2]
     2905            {0: 1, 1: 1, 2: 1, 3: 1, 4: 2}
    29052906            sage: F = graphs.Grid2dGraph(2,3)
    2906             sage: X = F.cliques_number_of(with_labels=True)
     2907            sage: X = F.cliques_number_of()
    29072908            sage: for v in sorted(X.iterkeys()):
    29082909            ...    print v, X[v]
    29092910            (0, 0) 2
     
    29132914            (1, 1) 3
    29142915            (1, 2) 2
    29152916            sage: F.cliques_number_of(vertices=[(0, 1), (1, 2)])
    2916             [3, 2]
     2917            {(0, 1): 3, (1, 2): 2}
    29172918            sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
    29182919            sage: G.show(figsize=[2,2])
    29192920            sage: G.cliques_number_of()
    2920             [2, 2, 1, 1]
     2921            {0: 2, 1: 2, 2: 1, 3: 1}
    29212922        """
    29222923        import networkx
    2923         return networkx.number_of_cliques(self.networkx_graph(copy=False), vertices, cliques, with_labels)
     2924        return networkx.number_of_cliques(self.networkx_graph(copy=False), vertices, cliques)
    29242925
    29252926    def cliques_get_max_clique_graph(self, name=''):
    29262927        """
     
    29962997        """
    29972998        from sage.graphs.cliquer import max_clique
    29982999        return max_clique(self.complement())
    2999 
     3000   
    30003001    def cliques_vertex_clique_number(self, algorithm="cliquer", vertices=None,
    3001                                      with_labels=False, cliques=None):
    3002         r"""
    3003         Returns a list of sizes of the largest maximal cliques containing
    3004         each vertex. (Returns a single value if only one input vertex).
     3002                                     cliques=None):
     3003        """
     3004        Returns a dictionary of sizes of the largest maximal cliques containing
     3005        each vertex, keyed by vertex. (Returns a single value if only one
     3006        input vertex).
    30053007       
    30063008        .. NOTE::
    30073009       
     
    30203022        -  ``vertices`` - the vertices to inspect (default is entire graph).
    30213023           Ignored unless ``algorithm=='networkx'``.
    30223024       
    3023         -  ``with_labels`` - (boolean) default False returns list as above
    3024            True returns a dictionary keyed by vertex labels. Ignored unless
    3025            ``algorithm=='networkx'``.
    3026        
    30273025        -  ``cliques`` - list of cliques (if already computed).  Ignored unless
    30283026           ``algorithm=='networkx'``.
    30293027       
     
    30313029       
    30323030            sage: C = Graph('DJ{')
    30333031            sage: C.cliques_vertex_clique_number()
    3034             [2, 4, 4, 4, 4]
     3032            {0: 2, 1: 4, 2: 4, 3: 4, 4: 4}
    30353033            sage: E = C.cliques_maximal()
    30363034            sage: E
    30373035            [[4, 0], [4, 1, 2, 3]]
    30383036            sage: C.cliques_vertex_clique_number(cliques=E,algorithm="networkx")
    3039             [2, 4, 4, 4, 4]
     3037            {0: 2, 1: 4, 2: 4, 3: 4, 4: 4}
    30403038            sage: F = graphs.Grid2dGraph(2,3)
    3041             sage: X = F.cliques_vertex_clique_number(with_labels=True,algorithm="networkx")
     3039            sage: X = F.cliques_vertex_clique_number(algorithm="networkx")
    30423040            sage: for v in sorted(X.iterkeys()):
    30433041            ...    print v, X[v]
    30443042            (0, 0) 2
     
    30483046            (1, 1) 2
    30493047            (1, 2) 2
    30503048            sage: F.cliques_vertex_clique_number(vertices=[(0, 1), (1, 2)])
    3051             [2, 2]
     3049            {(0, 1): 2, (1, 2): 2}
    30523050            sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
    30533051            sage: G.show(figsize=[2,2])
    30543052            sage: G.cliques_vertex_clique_number()
    3055             [3, 3, 3, 3]
     3053            {0: 3, 1: 3, 2: 3, 3: 3}
    30563054
    30573055        """
    30583056
     
    30603058            from sage.graphs.cliquer import clique_number
    30613059            if vertices==None:
    30623060                vertices=self
    3063             value=[]
     3061            value={}
    30643062            for v in vertices:
    3065                 value.append(1+clique_number(self.subgraph(self.neighbors(v))))
     3063                value[v] = 1+clique_number(self.subgraph(self.neighbors(v)))
    30663064                self.subgraph(self.neighbors(v)).plot()
    30673065            return value
    30683066        elif algorithm=="networkx":
    30693067            import networkx
    3070             return networkx.node_clique_number(self.networkx_graph(copy=False), vertices, with_labels, cliques)
     3068            return networkx.node_clique_number(self.networkx_graph(copy=False),vertices, cliques)
    30713069        else:
    30723070            raise NotImplementedError("Only 'networkx' and 'cliquer' are supported.")
    30733071
    3074     def cliques_containing_vertex(self, vertices=None, cliques=None, with_labels=False):
     3072    def cliques_containing_vertex(self, vertices=None, cliques=None):
    30753073        """
    3076         Returns the cliques containing each vertex, represented as a list
    3077         of lists. (Returns a single list if only one input vertex).
     3074        Returns the cliques containing each vertex, represented as a dictionary
     3075        of lists of lists, keyed by vertex. (Returns a single list if only one
     3076        input vertex).
    30783077       
    30793078        .. NOTE::
    30803079       
     
    30863085        -  ``vertices`` - the vertices to inspect (default is
    30873086           entire graph)
    30883087       
    3089         -  ``with_labels`` - (boolean) default False returns
    3090            list as above True returns a dictionary keyed by vertex labels
    3091        
    30923088        -  ``cliques`` - list of cliques (if already
    30933089           computed)
    30943090       
     
    30963092       
    30973093            sage: C = Graph('DJ{')
    30983094            sage: C.cliques_containing_vertex()
    3099             [[[4, 0]], [[4, 1, 2, 3]], [[4, 1, 2, 3]], [[4, 1, 2, 3]], [[4, 0], [4, 1, 2, 3]]]
     3095            {0: [[4, 0]], 1: [[4, 1, 2, 3]], 2: [[4, 1, 2, 3]], 3: [[4, 1, 2, 3]], 4: [[4, 0], [4, 1, 2, 3]]}
    31003096            sage: E = C.cliques_maximal()
    31013097            sage: E
    31023098            [[4, 0], [4, 1, 2, 3]]
    31033099            sage: C.cliques_containing_vertex(cliques=E)
    3104             [[[4, 0]], [[4, 1, 2, 3]], [[4, 1, 2, 3]], [[4, 1, 2, 3]], [[4, 0], [4, 1, 2, 3]]]
     3100            {0: [[4, 0]], 1: [[4, 1, 2, 3]], 2: [[4, 1, 2, 3]], 3: [[4, 1, 2, 3]], 4: [[4, 0], [4, 1, 2, 3]]}
    31053101            sage: F = graphs.Grid2dGraph(2,3)
    3106             sage: X = F.cliques_containing_vertex(with_labels=True)
     3102            sage: X = F.cliques_containing_vertex()
    31073103            sage: for v in sorted(X.iterkeys()):
    31083104            ...    print v, X[v]
    31093105            (0, 0) [[(0, 1), (0, 0)], [(1, 0), (0, 0)]]
     
    31133109            (1, 1) [[(0, 1), (1, 1)], [(1, 2), (1, 1)], [(1, 0), (1, 1)]]
    31143110            (1, 2) [[(1, 2), (0, 2)], [(1, 2), (1, 1)]]
    31153111            sage: F.cliques_containing_vertex(vertices=[(0, 1), (1, 2)])
    3116             [[[(0, 1), (0, 0)], [(0, 1), (0, 2)], [(0, 1), (1, 1)]], [[(1, 2), (0, 2)], [(1, 2), (1, 1)]]]
     3112            {(0, 1): [[(0, 1), (0, 0)], [(0, 1), (0, 2)], [(0, 1), (1, 1)]], (1, 2): [[(1, 2), (0, 2)], [(1, 2), (1, 1)]]}
    31173113            sage: G = Graph({0:[1,2,3], 1:[2], 3:[0,1]})
    31183114            sage: G.show(figsize=[2,2])
    31193115            sage: G.cliques_containing_vertex()
    3120             [[[0, 1, 2], [0, 1, 3]], [[0, 1, 2], [0, 1, 3]], [[0, 1, 2]], [[0, 1, 3]]]
     3116            {0: [[0, 1, 2], [0, 1, 3]], 1: [[0, 1, 2], [0, 1, 3]], 2: [[0, 1, 2]], 3: [[0, 1, 3]]}
    31213117
    31223118        """
    31233119        import networkx
    3124         return networkx.cliques_containing_node(self.networkx_graph(copy=False), vertices, cliques, with_labels)
     3120        return networkx.cliques_containing_node(self.networkx_graph(copy=False),vertices, cliques)
    31253121
    31263122    def clique_complex(self):
    31273123        """