Пример #1
0
def louvain(graph, layer, node_l, node_c, top, bot, couple, edge_l, edge_c,
            mu):
    current_graph = graph.copy()
    status = Status()

    status.layer = layer
    status.node_l = node_l
    status.node_c = node_c
    status.top = top
    status.bot = bot
    status.edge_l = edge_l
    status.edge_c = edge_c
    status.couple = couple
    status.mu = mu

    status.init(current_graph)

    old_status = status.copy()

    status_list = list()
    level_count = 0

    mod = __modularity(_get_commu_dict(status.node2com), status, graph)
    #print "Modularity before First Iteration ",mod

    __one_level(graph, old_status, current_graph, status, status_list,
                level_count)
    partition = __renumber(status.node2com)
    status_list.append(partition)
    current_graph, part, status = induced_graph_multilayer(
        partition, current_graph, status)

    mod1 = __modularity(_get_com_wise_nodes(part), status, current_graph)

    p = _get_com_wise_nodes(
        partition_at_level(status_list,
                           len(status_list) - 1))
    new_mod = __modularity(p, old_status, graph)
    #print "-> merge mod after level 0 : ", mod1
    #print "-> Modularity after level 0: ",new_mod, "\n"

    ##print("Louvain, partition: ",partition)
    #print("Louvain partition: ",part)
    A = nx.adjacency_matrix(current_graph)
    ##print(A.todense())

    status.init(current_graph)

    while True:
        level_count += 1
        ##print level_count
        modif = __one_level(graph, old_status, current_graph, status,
                            status_list, level_count, 1)

        partition = __renumber(status.node2com)
        status_list.append(partition)

        new_mod = __modularity(
            _get_commu_dict(partition_at_level(status_list, level_count)),
            old_status, graph)
        #print "-> Modularity after level ",level_count,": ",new_mod, "\n"

        #new_mod = __modularity(_get_commu_dict(partition), status, current_graph)
        #new_mod = __modularity(_get_com_wise_nodes(partition), status, current_graph)

        if modif == False:
            #if new_mod - mod < __MIN :

            break
        mod = new_mod
        #current_graph = induced_graph(partition, current_graph)
        current_graph, part, status = induced_graph_multilayer(
            partition, current_graph, status)
        #status.init(current_graph)
        status.init(current_graph, part)

        ##print("Louvain, partition: ",partition)
        #		#print("Louvain, part after: ",part)
        #		A = nx.adjacency_matrix(current_graph)
        ##print(A.todense())

    return status_list, mod