Cores
=====

Unit tests for cores decomposition in cores.py
----------------------------------------------

>>> from networkx import *
>>> from networkx.cores import *
>>> from networkx.generators.degree_seq import *


Below, graph G is the example graph in Figure 1 from Batagelj and
Zaversnik's paper titled An O(m) Algorithm for Cores Decomposition of
Networks, 2003, http://arXiv.org/abs/cs/0310049.  With nodes labeled
as shown, the 3-core is given by nodes 1-8, the 2-core by nodes 9-16,
the 1-core by nodes 17-20 and node 21 is in the 0-core.


>>> t1=tetrahedral_graph()
>>> t2=convert_node_labels_to_integers(t1,5)
>>> G=union(t1,t2)
>>> G.add_edges_from( [(3,7), (2,11), (11,5), (11,12), (5,12), (12,19),\
...             (12,18), (3,9), (7,9), (7,10), (9,10), (9,20),\
...             (17,13), (13,14), (14,15), (15,16), (16,13)])
>>> G.add_node(21)

    .. class:: doctest-block
    .. image:: cores_Batagelj_example.png

>>> cores=find_cores(G)
>>> nodes_by_core=[]
>>> for val in [0,1,2,3]:
...    nodes_by_core.append( sorted([k for k in cores if cores[k]==val]) )
>>> nodes_by_core[0]
[21]
>>> nodes_by_core[1]
[17, 18, 19, 20]
>>> nodes_by_core[2]
[9, 10, 11, 12, 13, 14, 15, 16]
>>> nodes_by_core[3] 
[1, 2, 3, 4, 5, 6, 7, 8]

Create the graph H resulting from the degree sequence
[0,1,2,2,2,2,3] when using the Havel-Hakimi algorithm. 


>>> degseq=[0,1,2,2,2,2,3]
>>> H=havel_hakimi_graph(degseq)

     .. class:: doctest-block
     .. image:: cores_H.png

>>> cores=find_cores(H)
>>> nodes_by_core=[]
>>> for val in [0,1,2]:
...    nodes_by_core.append( sorted([k for k in cores if cores[k]==val]) )
>>> nodes_by_core[0]
[1]
>>> nodes_by_core[1]
[2, 4]
>>> nodes_by_core[2]
[3, 5, 6, 7]
