def create_random_graph()

in src/graph_community.py [0:0]


    def create_random_graph(self, total_nodes, num_comm, prob_in, prob_out, seed=None):
        """
        Create a random partition graph with minimum degree >=1, save the group labels for
        graph nodes into a local file. If seed is provided, overwrite initialized seed value.

        :param total_nodes: int, Desired number of nodes in generated graph
        :param num_comm: int, Desired number of communities in graph
        :param prob_in: float, Probability of an edge between nodes in the same community
        :param prob_out: float, Probability of an edge between nodes in different communities
        :param seed: int, optional, If provided, use as seed value for generating random graphs
        """

        if seed is not None:
            self.seed = seed

        np.random.seed(self.seed)
        community_size = np.random.multinomial(total_nodes, np.ones(num_comm)/num_comm, size=self.seed)[0]
        nx_G = nx.random_partition_graph(community_size, prob_in, prob_out, self.seed)
        
        out_degree = dict(nx_G.degree(weight='weight'))
        seed_ = 1
        while (min(out_degree.values()) == 0) & (seed_ <= 50):
            seed_ += 1
            print(f"iterating graph generation with random seed {seed_}")
            nx_G = nx.random_partition_graph(community_size, prob_in, prob_out, seed=seed_)
            out_degree = dict(nx_G.degree(weight='weight'))
        
        if min(out_degree.values()) == 0:
            raise ValueError("some nodes have ZERO degree! Change random graph input settings and re-generate a graph.")
        
        print(nx.info(nx_G))
        
        # save node labels
        labels = [node_attributes['block'] for _, node_attributes in nx_G.nodes(data=True)]
        node_labels = list(enumerate(labels))
        
        if not os.path.exists('./data/synthetic'):
            os.makedirs('./data/synthetic')
        
        label_outfile = os.path.join(
            "./data/synthetic", f"node_labels_{total_nodes}_{num_comm}_{prob_in}_{prob_out}.node_labels")

        # Store node-label mapping to csv-string file
        with open(label_outfile, 'w') as file:
            file.writelines(','.join(str(j) for j in i) + '\n' for i in node_labels)
        
        return self._sort_nodes(nx_G)