Ticket #12806: trac_12806.reviewer.patch

File trac_12806.reviewer.patch, 20.1 KB (added by kini, 7 years ago)

apply to $SAGE_ROOT/devel/sage

  • sage/graphs/digraph.py

    # HG changeset patch
    # User Keshav Kini <keshav.kini@gmail.com>
    # Date 1339700712 25200
    # Node ID 6c3084cc29e9f6a798bd37d83c4741905c1998ed
    # Parent  fce2885538c9fb0e0fcf83867787768afaca6868
    formatting
    
    diff --git a/sage/graphs/digraph.py b/sage/graphs/digraph.py
    a b  
    25822582
    25832583    def topological_sort(self, implementation = "default"):
    25842584        """
    2585         Returns a topological sort of the digraph if it is acyclic, and raises a
    2586         TypeError if the digraph contains a directed cycle. As topological
    2587         sorts are not necessarily unique, different implementations may yield
    2588         different results.
    2589        
    2590         A topological sort is an ordering of the vertices of the digraph such
    2591         that each vertex comes before all of its successors. That is, if `u`
    2592         comes before `v` in the sort, then there may be a directed path from `u`
    2593         to `v`, but there will be no directed path from `v` to `u`.
     2585        Returns a topological sort of the digraph if it is acyclic, and
     2586        raises a TypeError if the digraph contains a directed cycle. As
     2587        topological sorts are not necessarily unique, different
     2588        implementations may yield different results.
     2589
     2590        A topological sort is an ordering of the vertices of the digraph
     2591        such that each vertex comes before all of its successors. That
     2592        is, if `u` comes before `v` in the sort, then there may be
     2593        a directed path from `u` to `v`, but there will be no directed
     2594        path from `v` to `u`.
    25942595
    25952596        INPUT:
    25962597
     
    26012602
    26022603        .. SEEALSO::
    26032604
    2604             - :meth:`is_directed_acyclic` -- Tests whether a directed graph is
    2605               acyclic (can also join a certificate -- a topological sort or a
    2606               circuit in the graph1).
    2607        
     2605            - :meth:`is_directed_acyclic` -- Tests whether a directed
     2606              graph is acyclic (can also join a certificate --
     2607              a topological sort or a circuit in the graph1).
     2608
    26082609        EXAMPLES::
    26092610
    2610             sage: D = DiGraph({ 0:[1,2,3], 4:[2,5], 1:[8], 2:[7], 3:[7], 5:[6,7], 7:[8], 6:[9], 8:[10], 9:[10] })
     2611            sage: D = DiGraph({ 0:[1,2,3], 4:[2,5], 1:[8], 2:[7], 3:[7],
     2612            ...     5:[6,7], 7:[8], 6:[9], 8:[10], 9:[10] })
    26112613            sage: D.plot(layout='circular').show()
    26122614            sage: D.topological_sort()
    26132615            [4, 5, 6, 9, 0, 1, 2, 3, 7, 8, 10]
    2614        
     2616
    26152617        ::
    2616        
     2618
    26172619            sage: D.add_edge(9,7)
    26182620            sage: D.topological_sort()
    26192621            [4, 5, 6, 9, 0, 1, 2, 3, 7, 8, 10]
     
    26222624
    26232625            sage: D.topological_sort(implementation = "NetworkX")
    26242626            [4, 5, 6, 9, 0, 1, 2, 3, 7, 8, 10]
    2625            
     2627
    26262628        Using the NetworkX recursive implementation ::
    26272629
    26282630            sage: D.topological_sort(implementation = "recursive")
    26292631            [4, 5, 6, 9, 0, 3, 2, 7, 1, 8, 10]
    26302632
    26312633        ::
    2632        
     2634
    26332635            sage: D.add_edge(7,4)
    26342636            sage: D.topological_sort()
    26352637            Traceback (most recent call last):
    26362638            ...
    2637             TypeError: Digraph is not acyclic-- there is no topological sort.
    2638        
     2639            TypeError: Digraph is not acyclic-- there is no topological
     2640            sort.
     2641
    26392642        .. note::
    26402643
    2641            There is a recursive version of this in NetworkX, it used to have problems in earlier versions but they have since been fixed::
    2642        
     2644           There is a recursive version of this in NetworkX, it used to
     2645        have problems in earlier versions but they have since been
     2646        fixed::
     2647
    26432648              sage: import networkx
    2644               sage: D = DiGraph({ 0:[1,2,3], 4:[2,5], 1:[8], 2:[7], 3:[7], 5:[6,7], 7:[8], 6:[9], 8:[10], 9:[10] })
     2649              sage: D = DiGraph({ 0:[1,2,3], 4:[2,5], 1:[8], 2:[7], 3:[7],
     2650              ...     5:[6,7], 7:[8], 6:[9], 8:[10], 9:[10] })
    26452651              sage: N = D.networkx_graph()
    26462652              sage: networkx.topological_sort(N)
    26472653              [4, 5, 6, 9, 0, 1, 2, 3, 7, 8, 10]
     
    26552661            sage: D.topological_sort(implementation = "cloud-reading")
    26562662            Traceback (most recent call last):
    26572663            ...
    2658             ValueError: implementation must be set to one of "default" or "NetworkX"
     2664            ValueError: implementation must be set to one of "default"
     2665            or "NetworkX"
    26592666        """
    26602667
    26612668        if implementation == "default":
  • sage/graphs/generic_graph.py

    diff --git a/sage/graphs/generic_graph.py b/sage/graphs/generic_graph.py
    a b  
    1082310823       
    1082410824    def clustering_coeff(self, nodes=None, weight=False, return_vertex_weights=True):
    1082510825        r"""
    10826         Returns the clustering coefficient for each vertex in `nodes` as a
    10827         dictionary keyed by vertex.
    10828        
    10829         For an unweighted graph, the clustering coefficient of a node `i` is
    10830         the fraction of possible triangles containing `i` that exist.
    10831         `c_i = 2\*T(i) / (k_i\*(k_i-1))` where T(i)` the number of triangles
    10832         through `i` and `k_i` is the degree of vertex `i` [1].
    10833        
    10834         For weighted graphs the clustering is defined as the geometric average
    10835         of the subgraph edge weights [1], normalized by the maximum weight in
    10836         the network.
    10837        
     10826        Returns the clustering coefficient for each vertex in `nodes` as
     10827        a dictionary keyed by vertex.
     10828
     10829        For an unweighted graph, the clustering coefficient of a node
     10830        `i` is the fraction of possible triangles containing `i` that
     10831        exist. `c_i = 2\*T(i) / (k_i\*(k_i-1))` where T(i)` the number
     10832        of triangles through `i` and `k_i` is the degree of vertex `i`
     10833        [1].
     10834
     10835        For weighted graphs the clustering is defined as the geometric
     10836        average of the subgraph edge weights [1], normalized by the
     10837        maximum weight in the network.
     10838
    1083810839        The value of `c_i` is assigned to 0 if `k_i < 2`.
    10839        
     10840
    1084010841        A coefficient for the whole graph is the average of the `c_i`.
    10841        
     10842
    1084210843        Transitivity is the fraction of all possible triangles which are
    1084310844        triangles, T = 3\*triangles/triads, [1].
    10844        
    10845         INPUT:
    10846        
    10847         -  ``nodes`` - the vertices to inspect (default
    10848            None returns data on all vertices in graph)
    10849        
    10850         -  ``weight`` - string or boolean default is False. If it is a string
    10851         it used the indicated edge property as weight. `weight = True` is
    10852         equivalent to `weight = weight`
    10853        
    10854         - ``return_vertex_weights`` is a boolean ensuring backwards 
    10855         compatibility with deprecated features of NetworkX 1.2. It
    10856         should be set to False for all production code.
    10857        
     10845
     10846        INPUT:
     10847
     10848        - ``nodes`` - the vertices to inspect (default None returns data
     10849          on all vertices in graph)
     10850
     10851        - ``weight`` - string or boolean default is False. If it is
     10852          a string it used the indicated edge property as weight.
     10853          `weight = True` is equivalent to `weight = weight`
     10854
     10855        - ``return_vertex_weights`` is a boolean ensuring backwards
     10856          compatibility with deprecated features of NetworkX 1.2. It
     10857          should be set to False for all production code.
     10858
    1085810859        REFERENCE:
    1085910860
    1086010861        - [1] Aric Hagberg, Dan Schult and Pieter Swart. NetworkX
    1086110862          documentation. [Online] Available:
    1086210863          https://networkx.lanl.gov/reference/networkx/
    10863        
    10864         EXAMPLES::
    10865        
     10864
     10865        EXAMPLES::
     10866
    1086610867            sage: (graphs.FruchtGraph()).clustering_coeff().values()
    10867             [0.3333333333333333, 0.3333333333333333, 0.0, 0.3333333333333333, 0.3333333333333333, 0.3333333333333333, 0.3333333333333333, 0.3333333333333333, 0.0, 0.3333333333333333, 0.3333333333333333, 0.0]
     10868            [0.3333333333333333, 0.3333333333333333, 0.0, 0.3333333333333333,
     10869             0.3333333333333333, 0.3333333333333333, 0.3333333333333333,
     10870             0.3333333333333333, 0.0, 0.3333333333333333, 0.3333333333333333,
     10871             0.0]
    1086810872            sage: (graphs.FruchtGraph()).clustering_coeff()
    10869             {0: 0.3333333333333333, 1: 0.3333333333333333, 2: 0.0, 3: 0.3333333333333333, 4: 0.3333333333333333, 5: 0.3333333333333333, 6: 0.3333333333333333, 7: 0.3333333333333333, 8: 0.0, 9: 0.3333333333333333, 10: 0.3333333333333333, 11: 0.0}
    10870 
    10871             sage: (graphs.FruchtGraph()).clustering_coeff(weight=True, return_vertex_weights=False)
    10872             {0: 0.3333333333333333, 1: 0.3333333333333333, 2: 0.0, 3: 0.3333333333333333, 4: 0.3333333333333333, 5: 0.3333333333333333, 6: 0.3333333333333333, 7: 0.3333333333333333, 8: 0.0, 9: 0.3333333333333333, 10: 0.3333333333333333, 11: 0.0}
     10873            {0: 0.3333333333333333, 1: 0.3333333333333333, 2: 0.0,
     10874             3: 0.3333333333333333, 4: 0.3333333333333333,
     10875             5: 0.3333333333333333, 6: 0.3333333333333333,
     10876             7: 0.3333333333333333, 8: 0.0, 9: 0.3333333333333333,
     10877             10: 0.3333333333333333, 11: 0.0}
     10878
     10879            sage: (graphs.FruchtGraph()).clustering_coeff(weight=True,
     10880            ...     return_vertex_weights=False)
     10881            {0: 0.3333333333333333, 1: 0.3333333333333333, 2: 0.0,
     10882            3: 0.3333333333333333, 4: 0.3333333333333333,
     10883            5: 0.3333333333333333, 6: 0.3333333333333333,
     10884            7: 0.3333333333333333, 8: 0.0, 9: 0.3333333333333333,
     10885            10: 0.3333333333333333, 11: 0.0}
    1087310886            sage: (graphs.FruchtGraph()).clustering_coeff(nodes=[0,1,2])
    1087410887            {0: 0.3333333333333333, 1: 0.3333333333333333, 2: 0.0}
    1087510888
    10876             sage: (graphs.FruchtGraph()).clustering_coeff(nodes=[0,1,2],weight=True,  return_vertex_weights=False)
     10889            sage: (graphs.FruchtGraph()).clustering_coeff(nodes=[0,1,2],
     10890            ...     weight=True, return_vertex_weights=False)
    1087710891            {0: 0.3333333333333333, 1: 0.3333333333333333, 2: 0.0}
    1087810892
    10879         TESTS::
    10880 
    10881             Failing doctest due to API change, use for backwards compatibility
    10882             Remove when return_vertex_weights is deprecated
    10883             sage: (graphs.FruchtGraph()).clustering_coeff(weight=True, return_vertex_weights=True)
    10884             doctest:...: DeprecationWarning: The option 'return_vertex_weights' has been deprecated. Only offered for backwards compatibility with NetworkX 1.2.
    10885             ({0: 0.3333333333333333, 1: 0.3333333333333333, 2: 0.0, 3: 0.3333333333333333, 4: 0.3333333333333333, 5: 0.3333333333333333, 6: 0.3333333333333333, 7: 0.3333333333333333, 8: 0.0, 9: 0.3333333333333333, 10: 0.3333333333333333, 11: 0.0}, {0: 0.08333333333333333, 1: 0.08333333333333333, 2: 0.08333333333333333, 3: 0.08333333333333333, 4: 0.08333333333333333, 5: 0.08333333333333333, 6: 0.08333333333333333, 7: 0.08333333333333333, 8: 0.08333333333333333, 9: 0.08333333333333333, 10: 0.08333333333333333, 11: 0.08333333333333333})
    10886 
    10887             sage: (graphs.FruchtGraph()).clustering_coeff(nodes=[0,1,2], weight=True, return_vertex_weight=True)
    10888             doctest:...: DeprecationWarning: The option 'return_vertex_weights' has been deprecated. Only offered for backwards compatibility with NetworkX 1.2.
    10889             ({0: 0.3333333333333333, 1: 0.3333333333333333, 2: 0.0}, {0: 0.3333333333333333, 1: 0.3333333333333333, 2: 0.3333333333333333})
    10890 
     10893        TESTS:
     10894
     10895        Doctests that demonstrate the deprecation of the two-dictionary
     10896        return value due to the NetworkX API change after 1.2. The
     10897        return_vertex_weights keyword is provided with a default value
     10898        of True for backwards compatibility with older versions of Sage.
     10899        When the deprecation period has expired and the keyword is
     10900        removed, these doctests should be removed as well. ::
     10901
     10902            sage: (graphs.FruchtGraph()).clustering_coeff(weight=True,
     10903            ...     return_vertex_weights=True)
     10904            doctest:...: DeprecationWarning: The option 'return_vertex_weights'
     10905            has been deprecated. Only offered for backwards compatibility with
     10906            NetworkX 1.2.
     10907            ({0: 0.3333333333333333, 1: 0.3333333333333333, 2: 0.0,
     10908              3: 0.3333333333333333, 4: 0.3333333333333333,
     10909              5: 0.3333333333333333, 6: 0.3333333333333333,
     10910              7: 0.3333333333333333, 8: 0.0, 9: 0.3333333333333333,
     10911              10: 0.3333333333333333, 11: 0.0}, {0: 0.08333333333333333,
     10912              1: 0.08333333333333333, 2: 0.08333333333333333,
     10913              3: 0.08333333333333333, 4: 0.08333333333333333,
     10914              5: 0.08333333333333333, 6: 0.08333333333333333,
     10915              7: 0.08333333333333333, 8: 0.08333333333333333,
     10916              9: 0.08333333333333333, 10: 0.08333333333333333,
     10917              11: 0.08333333333333333})
     10918
     10919            sage: (graphs.FruchtGraph()).clustering_coeff(nodes=[0, 1, 2],
     10920            ...     weight=True, return_vertex_weights=True)
     10921            ({0: 0.3333333333333333, 1: 0.3333333333333333, 2: 0.0},
     10922             {0: 0.3333333333333333, 1: 0.3333333333333333,
     10923             2: 0.3333333333333333})
    1089110924        """
    1089210925        import networkx
    1089310926        if weight and return_vertex_weights:
     
    1091210945            for v,w in weights.iteritems():
    1091310946                weights[v]=w*scale
    1091410947            return clusterc,weights
    10915            
     10948
    1091610949        else:
    1091710950            return networkx.clustering(self.networkx_graph(copy=False), nodes, weight=weight)
    10918        
     10951
    1091910952    def cluster_transitivity(self):
    1092010953        r"""
    1092110954        Returns the transitivity (fraction of transitive triangles) of the
  • sage/graphs/graph.py

    diff --git a/sage/graphs/graph.py b/sage/graphs/graph.py
    a b  
    32623262
    32633263    ### Centrality
    32643264
    3265     def centrality_betweenness(self, k=None, normalized=True, weight=None, endpoints=False, seed=None):
     3265    def centrality_betweenness(self, k=None, normalized=True, weight=None,
     3266            endpoints=False, seed=None):
    32663267        r"""
    3267         Returns the betweenness centrality (fraction of number of shortest
    3268         paths that go through each vertex) as a dictionary keyed by
    3269         vertices. The betweenness is normalized by default to be in range
    3270         (0,1). This wraps NetworkX's implementation of the algorithm
    3271         described in [Brandes2003]_.
    3272        
    3273         Measures of the centrality of a vertex within a graph determine the
    3274         relative importance of that vertex to its graph. Vertices that
    3275         occur on more shortest paths between other vertices have higher
    3276         betweenness than vertices that occur on less.
    3277        
     3268        Returns the betweenness centrality (fraction of number of
     3269        shortest paths that go through each vertex) as a dictionary
     3270        keyed by vertices. The betweenness is normalized by default to
     3271        be in range (0,1). This wraps NetworkX's implementation of the
     3272        algorithm described in [Brandes2003]_.
     3273
     3274        Measures of the centrality of a vertex within a graph determine
     3275        the relative importance of that vertex to its graph. Vertices
     3276        that occur on more shortest paths between other vertices have
     3277        higher betweenness than vertices that occur on less.
     3278
    32783279        INPUT:
    3279        
    3280        
    3281         -  ``normalized`` - boolean (default True) - if set to
    3282            False, result is not normalized.
    3283        
    3284         - ``k`` - integer or None (default None) - if set to an integer, use ``k`` node samples to estimate betweenness. Higher values give better approximations.
    3285        
    3286         - ``weight`` - None or string. If set to a string, use that attribute of the nodes as weight. ``weight = True`` is equivalent to ``weight = "weight"``
    3287        
    3288         - ``endpoints`` - Boolean. If set to True it includes the endpoints in the shortest paths count
    3289        
     3280
     3281
     3282        -  ``normalized`` - boolean (default True) - if set to False,
     3283           result is not normalized.
     3284
     3285        - ``k`` - integer or None (default None) - if set to an integer,
     3286          use ``k`` node samples to estimate betweenness. Higher values
     3287          give better approximations.
     3288
     3289        - ``weight`` - None or string. If set to a string, use that
     3290          attribute of the nodes as weight. ``weight = True`` is
     3291          equivalent to ``weight = "weight"``
     3292
     3293        - ``endpoints`` - Boolean. If set to True it includes the
     3294          endpoints in the shortest paths count
     3295
    32903296        REFERENCE:
    32913297
    32923298        .. [Brandes2003] Ulrik Brandes. (2003). Faster Evaluation of
    3293           Shortest-Path Based Centrality Indices. [Online] Available:
    3294           http://citeseer.nj.nec.com/brandes00faster.html
    3295        
     3299           Shortest-Path Based Centrality Indices. [Online] Available:
     3300           http://citeseer.nj.nec.com/brandes00faster.html
     3301
    32963302        EXAMPLES::
    3297        
     3303
    32983304            sage: (graphs.ChvatalGraph()).centrality_betweenness()
    3299             {0: 0.06969696969696969, 1: 0.06969696969696969, 2: 0.0606060606060606, 3: 0.0606060606060606, 4: 0.06969696969696969, 5: 0.06969696969696969, 6: 0.0606060606060606, 7: 0.0606060606060606, 8: 0.0606060606060606, 9: 0.0606060606060606, 10: 0.0606060606060606, 11: 0.0606060606060606}
    3300             sage: (graphs.ChvatalGraph()).centrality_betweenness(normalized=False)
    3301             {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}
     3305            {0: 0.06969696969696969, 1: 0.06969696969696969,
     3306             2: 0.0606060606060606, 3: 0.0606060606060606,
     3307             4: 0.06969696969696969, 5: 0.06969696969696969,
     3308             6: 0.0606060606060606, 7: 0.0606060606060606,
     3309             8: 0.0606060606060606, 9: 0.0606060606060606,
     3310             10: 0.0606060606060606, 11: 0.0606060606060606}
     3311            sage: (graphs.ChvatalGraph()).centrality_betweenness(
     3312            ...     normalized=False)
     3313            {0: 3.833333333333333, 1: 3.833333333333333, 2: 3.333333333333333,
     3314             3: 3.333333333333333, 4: 3.833333333333333, 5: 3.833333333333333,
     3315             6: 3.333333333333333, 7: 3.333333333333333, 8: 3.333333333333333,
     3316             9: 3.333333333333333, 10: 3.333333333333333,
     3317             11: 3.333333333333333}
    33023318            sage: D = DiGraph({0:[1,2,3], 1:[2], 3:[0,1]})
    33033319            sage: D.show(figsize=[2,2])
    33043320            sage: D = D.to_undirected()
     
    33073323            {0: 0.16666666666666666, 1: 0.16666666666666666, 2: 0.0, 3: 0.0}
    33083324        """
    33093325        import networkx
    3310         return networkx.betweenness_centrality(self.networkx_graph(copy=False), k=k,normalized = normalized, weight=weight, endpoints=endpoints, seed=seed )
    3311        
     3326        return networkx.betweenness_centrality(self.networkx_graph(copy=False),
     3327                k=k, normalized=normalized, weight=weight, endpoints=endpoints,
     3328                seed=seed)
     3329
    33123330    def centrality_degree(self, v=None):
    33133331        r"""
    33143332        Returns the degree centrality (fraction of vertices connected to)
  • sage/graphs/graph_generators.py

    diff --git a/sage/graphs/graph_generators.py b/sage/graphs/graph_generators.py
    a b  
    44814481
    44824482        TESTS:
    44834483
    4484          Normally we would only consider balanced trees whose root node
    4485          has degree `r \geq 2`, but the construction degenerates gracefully::
     4484         Normally we would only consider balanced trees whose root node
     4485         has degree `r \geq 2`, but the construction degenerates
     4486         gracefully::
    44864487
    44874488            sage: graphs.BalancedTree(1, 10)
    44884489            Balanced tree: Graph on 2 vertices
    4489            
     4490
    44904491            sage: graphs.BalancedTree(-1, 10)
    44914492            Balanced tree: Graph on 1 vertex
    44924493
     
    44964497            sage: graphs.BalancedTree(3, 0)
    44974498            Balanced tree: Graph on 1 vertex
    44984499
    4499             sage: graphs.BalancedTree(5, -2) 
     4500            sage: graphs.BalancedTree(5, -2)
    45004501            Balanced tree: Graph on 0 vertices
    45014502
    45024503            sage: graphs.BalancedTree(-2,-2)
     
    60906091        ::
    60916092       
    60926093            sage: graphs.RandomHolmeKim(8, 2, 0.5).edges(labels=False)
    6093             [(0, 2), (0, 5), (1, 2), (1, 3), (2, 3), (2, 4), (2, 6), (2, 7), (3, 4), (3, 6), (3, 7), (4, 5)]
     6094            [(0, 2), (0, 5), (1, 2), (1, 3), (2, 3), (2, 4), (2, 6), (2, 7),
     6095             (3, 4), (3, 6), (3, 7), (4, 5)]
    60946096       
    60956097        ::
    60966098