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)