File: core.py

package info (click to toggle)
python-networkx 1.1-2
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 2,780 kB
  • ctags: 1,910
  • sloc: python: 29,050; makefile: 126
file content (62 lines) | stat: -rw-r--r-- 1,949 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
"""
Find the k-cores of a graph.
The k-core is found by recursively pruning nodes with degrees less than k. 
"""
__author__ = "\n".join(['Dan Schult(dschult@colgate.edu)',
                        'Jason Grout(jason-sage@creativetrax.com)'])
#    Copyright (C) 2004-2008 by 
#    Aric Hagberg <hagberg@lanl.gov>
#    Dan Schult <dschult@colgate.edu>
#    Pieter Swart <swart@lanl.gov>
#    All rights reserved.
#    BSD license.

__all__ = ['find_cores']

def find_cores(G):
    """Return the core number for each vertex.
    
    Parameters
    ----------
    G : NetworkX graph
       A graph
  
    Returns
    -------
    core_number : dictionary 
       A ditionary keyed by node to the core number. 

    References
    ----------
    .. [1] An O(m) Algorithm for Cores Decomposition of Networks
       Vladimir Batagelj and Matjaz Zaversnik,  2003
       http://arxiv.org/abs/cs.DS/0310049 
    """
    # compute the degrees of each vertex
    degrees=G.degree()
    # sort verticies by degree
    verts= sorted( degrees.keys(), key=lambda x: degrees[x])
    bin_boundaries=[0]
    curr_degree=0
    for i,v in enumerate(verts):
        if degrees[v]>curr_degree:
            bin_boundaries.extend([i]*(degrees[v]-curr_degree))
            curr_degree=degrees[v]
    vert_pos = dict((v,pos) for pos,v in enumerate(verts))
    # Set up initial guesses for core and lists of neighbors.
    core= degrees
    nbrs=dict((v,set(G.neighbors(v))) for v in G)
    # form vertex core building up from smallest
    for v in verts:
        for u in nbrs[v]:
            if core[u] > core[v]:
                nbrs[u].remove(v)
                pos=vert_pos[u]
                bin_start=bin_boundaries[core[u]]
                vert_pos[u]=bin_start
                vert_pos[verts[bin_start]]=pos
                verts[bin_start],verts[pos]=verts[pos],verts[bin_start]
                bin_boundaries[core[u]]+=1
                core[u] -= 1
    return core