def sdg(num_nodes, num_edges, epsilon1, epsilon2):
gen_graph = nx.DiGraph()
nodes = range(num_nodes)
gen_graph.add_nodes_from(nodes)
i = 0
while i < num_edges:
# choose out node uniformly
if random.random() < epsilon1 or len(gen_graph.edges()) < 1:
out_node = random.choice(nodes)
# choose out based on preferential attachment
else:
out_nodes = gen_graph.out_degree().keys()
out_degree = np.array(gen_graph.out_degree().values())
out_node = np.random.choice(out_nodes, p=out_degree/(1.0 * i))
# choose in node uniformly
if random.random() < epsilon2 or len(gen_graph.edges()) < 1:
if 0 not in gen_graph.in_degree().values():
in_node = random.choice(nodes)
# choose in based on preferential attachment
else:
if len(nx.isolates(gen_graph)) > 0:
in_node = random.choice(nx.isolates(gen_graph))
else:
in_node_degree = 1
while in_node_degree > 0:
in_node = random.choice(gen_graph.nodes())
in_node_degree = gen_graph.in_degree(in_node)
else:
in_nodes = gen_graph.in_degree().keys()
in_degree = np.array(gen_graph.in_degree().values())
in_node = np.random.choice(in_nodes, p=in_degree / (1.0 * i))
if out_node != in_node and (out_node, in_node) not in gen_graph.edges():
gen_graph.add_edge(out_node, in_node)
i += 1
return gen_graph
评论列表
文章目录