示例#1
0
    def restart_clustering(self, w, p_a, parent_id):
        """ restart network division after the state of submodule movement
            and then restart the recursive clustering after
        """
        QL = ql.Quality()
        #print("##### start re-clustering for node id", parent_id)
        node_list, module_list = self.__Tree.subtree2modulelist(parent_id)

        #print("##### module list before\n",module_list)
        w_part, pa_part, id_glo_loc = self.extract_partial_w_pa(
            w.tocsr(), p_a, module_list)
        #print("##### w_part pa_part check", w_part, pa_part, id_glo_loc)

        # restart clustering from this state
        restarted_cluster = cc.Cluster_Core(w_part, pa_part, node_list,
                                            module_list)
        # take new state of module list
        module_list = restarted_cluster.get_modules()
        restarted_cluster.set_nodes_global_id(id_glo_loc)
        #print("##### module list after\n",module_list)

        #modify the tree composition
        self.__Tree.replace_subtree(parent_id, module_list)

        ql_now = restarted_cluster.get_ql_final()
        #ql_now = QL.get_hierarchical_quality_value(self.__Tree.get_tree_list(), self.glob_w, self.glob_pa)

        return ql_now
示例#2
0
    def __init__(self, w, p_a):
        # keep accesses to global w p_a
        self.glob_w = w
        self.glob_pa = p_a

        # Initially clustring for two-levl
        Two_level = cc.Cluster_Core(w, p_a)

        # get clustring results
        self.__nodes = Two_level.get_nodes()
        self.__modules = Two_level.get_modules()

        # get the final quality value
        ql_first_division = Two_level.get_ql_final()
        # advance division till no further splits are possible.
        # then submodule and single node movement are done with Depth-First Searching order.
        self.build_network_tree(w, p_a, self.__modules, ql_first_division)
示例#3
0
    def __init__(self, w, p_a):

        # Initially clustring for two-level
        Two_level = cc.Cluster_Core(w, p_a)

        # get clustring results
        self.__nodes = Two_level.get_nodes()
        self.__modules = Two_level.get_modules()
        # get the final quality value
        ql_first_division = Two_level.get_ql_final()
        print("ql initi val", ql_first_division)

        if cf.modified_louvain == True:
            print("============================================")
            print("modified_louvain mode is selected.")
            print("start recursive modules/submodules division.")
            print("============================================")

            self.build_network_tree(w, p_a, self.__modules, ql_first_division)

        else:
            self.ql_final = ql_first_division
示例#4
0
    def restart_clustering(self, w, p_a, parent_id):
        """ restart network division after the state of submodule movement
            and then restart the recursive clustering after
        """

        node_list, module_list = self.__Tree.subtree2modulelist(parent_id)

        w_part, pa_part, id_glo_loc = self.extract_partial_w_pa(
            w.tocsr(), p_a, module_list)

        # restart clustering from this state
        restarted_cluster = cc.Cluster_Core(w_part, pa_part, node_list,
                                            module_list)
        # take new state of module list
        module_list = restarted_cluster.get_modules()
        restarted_cluster.set_nodes_global_id(id_glo_loc)

        #modify the tree composition
        self.__Tree.replace_subtree(parent_id, module_list)

        ql_now = restarted_cluster.get_ql_final()

        return ql_now
示例#5
0
    def one_level_finer(self, w, p_a, grand_parent_id, ql_init):
        """ this function tries to expand each branch of the tree
            by being called recursively


        tree_elements,  level
        :
        .   ------------ grand parent
        | \  
        .   .   -------- parent
        |\  |\
        . . . .    ----- child
        : : : :

        """
        # initiation
        QL = ql.Quality()
        loop_count = 0
        ql_best = ql_init
        ql_now = None
        store_tree = copy.deepcopy(self.__Tree.get_tree_list())

        while loop_count < cf.num_trial:
            # for fast conversion
            if grand_parent_id != 0:
                loop_count = cf.num_trial

            queue_ids = copy.deepcopy(
                self.__Tree.get_element_object(grand_parent_id).id_child)

            while queue_ids:
                # get the parent id of this branch
                parent_id = queue_ids[0]
                mod = self.__Tree.tree_ele2one_module(parent_id)

                num_nodes = mod.get_num_nodes()
                if num_nodes == 1:  # module with only one member may not be divided anymore
                    pass
                else:
                    # extract the partial w matrix and pa array
                    w_part, pa_part, id_glo_loc = self.extract_partial_w_pa(
                        w.tocsr(), p_a, mod)
                    sub_level = cc.Cluster_Core(w_part, pa_part)

                    # set global node ids
                    sub_level.set_nodes_global_id(id_glo_loc)
                    sub_modules = sub_level.get_modules()

                    if len(sub_modules) == 1 or len(sub_modules) == num_nodes:
                        pass
                    else:
                        # get quality value
                        ql_temp = sub_level.get_ql_final()

                        # append a branch to the tree
                        # register a new branch
                        self.__Tree.add_one_level(sub_modules, parent_id)

                        erased_id = self.one_level_finer(
                            w, p_a, parent_id, ql_temp)

                        # get quality value
                        #ql_temp = sub_level.get_ql_final()
                        #ql_temp =  QL.get_hierarchical_quality_value(self.__Tree.get_tree_list(), self.glob_w, self.glob_pa)

                        # modify the queue list
                        if erased_id != None:
                            for i in range(len(queue_ids)):
                                ele_id = queue_ids[i]
                                if ele_id >= erased_id:
                                    queue_ids[i] -= 1

                # erase a queue already done
                queue_ids.pop(0)

            # reconstruct module_list from subtree
            node_list, module_list = self.__Tree.subtree2modulelist(
                grand_parent_id)

            # restart clustering
            ql_now = self.restart_clustering(w, p_a, grand_parent_id)

            # if the quality of this subtree is imploved
            if QL.check_network_got_better(ql_best, ql_now) == True:
                ql_best = ql_now
                ## store and replace the state of the entire tree
                store_tree = copy.deepcopy(self.__Tree.get_tree_list())
                #self.final_store = copy.deepcopy(self.__Tree.get_tree_list())

            else:
                # go to the next loop
                pass

            loop_count += 1

            #if grand_parent_id == 1: ######## for test
            ql_global_temp = QL.get_hierarchical_quality_value(
                self.__Tree.get_tree_list(), self.glob_w, self.glob_pa)
            if QL.check_network_got_better(self.ql_global_best,
                                           ql_global_temp) == True:
                self.ql_global_best = ql_global_temp
                self.final_store = copy.deepcopy(self.__Tree.get_tree_list())

            if grand_parent_id == 0:
                #print("ql_best", ql_best)
                #print(store_tree)
                self.__Tree.tree_draw_with_ete3(0, ql_now)

            # erase "#" for indicate tree states at each step
            #print( self.__Tree.print_tree())
            #self.__Tree.tree_draw_with_ete3(0, ql_global_temp)

        ### end while loop

        self.__Tree.set_tree_list(store_tree)
        # reload the best state of tree
        # sub module movement will be invoked

        # when extention for one subtree stoped (need to )
        if grand_parent_id != 0:
            #print("finish all branches of this subtree finished")
            #print("id", grand_parent_id, "will be erased")
            self.submodule_movement_onesubtree(grand_parent_id)
            erased_id = grand_parent_id
        else:
            #print("recursive tree branch extention finished")
            self.__Tree.set_tree_list(self.final_store)

            erased_id = None
            #print("ql initial ---> best", ql_init, " ---> ",ql_best)
        return erased_id