<BlockState object with 23 blocks (23 nonempty), degree-corrected, for graph <Graph object, directed, with 297 vertices and 2359 edges at 0x...>, at 0x...>

<BlockState object with 6 blocks (6 nonempty), for graph <Graph object, directed, with 23 vertices and 249 edges at 0x...>, at 0x...>

<BlockState object with 2 blocks (2 nonempty), for graph <Graph object, directed, with 6 vertices and 31 edges at 0x...>, at 0x...>

<BlockState object with 1 blocks (1 nonempty), for graph <Graph object, directed, with 2 vertices and 4 edges at 0x...>, at 0x...>

This means that we can inspect the hierarchical partition just as before:

.. testcode:: celegans

r = levels[0].get_blocks()[42] # group membership of node 42 in level 0

print(r)

r = levels[0].get_blocks()[r] # group membership of node 42 in level 1

print(r)

r = levels[0].get_blocks()[r] # group membership of node 42 in level 2

print(r)

.. testoutput:: celegans

10

6

4

Model selection

+++++++++++++++

As mentioned above, one can select the best model according to the

choice that yields the smallest description length. For instance, in