graphscope.nx.generators.joint_degree_seq.directed_joint_degree_graph

graphscope.nx.generators.joint_degree_seq.directed_joint_degree_graph(in_degrees, out_degrees, nkk, seed=None)[源代码]

生成一个具有联合度数的随机简单有向图。

Parameters:
  • degree_seq (列表,元素为元组 (大小为3)) – 度序列包含由节点ID、入度和出度组成的元组。

  • nkk (dictionary of dictionary of integers) – 有向联合度数字典,对于出度为k的节点(字典的第一层)和入度为l的节点(字典的第二层)描述了边的数量。

  • seed (hashable object, optional) – 随机数生成器的种子值。

Returns:

G – 具有指定输入的有向图。

Return type:

Graph

Raises:

NetworkXError - 如果degree_seq和nkk无法实现为简单的有向图。

备注

与无向版本类似: 在“while循环”的每次迭代中,算法会选择两个未连接的节点v和w,其度数分别为k和l,且对应的nkk[k][l]尚未达到目标值,即(对于给定的k,l):n_edges_add < nkk[k][l]。 然后添加边(v,w),并始终将图G中的边数增加一条。

该算法的智能之处在于,即使一个或两个节点没有空闲存根,也总能在未连接的节点v和w之间添加一条边,前提是nkk[degree(v)][degree(w)]尚未达到其目标值。如果节点v或w没有空闲存根,我们会执行"邻居交换"操作,这是一种边重连移动,可以在保持nkk不变的同时释放出一个空闲存根。

有向版本的差异在于邻居交换可能无法重新连接,但在这些情况下可以重新分配未饱和节点来替代使用,详细描述和证明请参见[1]。

该算法会在图的边数E次“while循环”迭代后继续执行,此时给定的nkk[k][l]所有条目均已达到目标值,构建过程完成。

参考文献

[1] B. Tillman, A. Markopoulou, C. T. Butts & M. Gjoka,

《有向2K图的构建》。发表于KDD 2017会议论文集。

示例

>>> in_degrees = [0, 1, 1, 2]
>>> out_degrees = [1, 1, 1, 1]
>>> nkk = {1: {1: 2, 2: 2}}
>>> G = nx.directed_joint_degree_graph(in_degrees, out_degrees, nkk)
>>>