is_minimal_d_separator#

is_minimal_d_separator(G, x, y, z, *, included=None, restricted=None)[源码]#

确定 z 是否是 xy 的最小 d-分离集。

DAG 中的 d-分离集 z 是一组节点,它阻塞了从集合 x 中的节点到集合 y 中的节点的所有路径。最小 d-分离集是一个 d-分离集 z,移除其任何子集都会使其不再是 d-分离集。

注意:此函数检查 z 是否既是 d-分离集又是最小的。可以使用函数 is_d_separator 仅检查 z 是否是 d-分离集。参见下面的示例。

参数:
Gnx.DiGraph

一个 NetworkX 有向无环图(DAG)。

x节点 | 集合

图中的一个节点或一组节点。

y节点 | 集合

图中的一个节点或一组节点。

z节点 | 集合

要检查是否是最小 d-分离集的一个节点或一组节点。此函数内部会调用函数 is_d_separator() 来验证 z 实际上是一个 d-分离集。

included集合 | 节点 | None

必须包含在找到的分离集中的一个节点或一组节点,默认为 None,表示空集。

restricted集合 | 节点 | None

要考虑的受限节点或节点集。只有这些节点可以包含在找到的分离集中,默认为 None,表示 G 中的所有节点。

返回:
bool

集合 z 在受限节点 restricted 和包含节点 included 的约束下是否是一个最小 d-分离集。

引发:
NetworkXError

如果输入图不是 DAG,则引发 NetworkXError

NodeNotFound

如果在图中找不到任何输入节点,则会引发 NodeNotFound 异常。

说明

此函数用于验证一个集合在两个节点之间是否是最小且 d-分离的。使用了 [1] 第 4 页的判据 (a), (b), (c)。a) closure(x) 和 y 是不相交的。b) z 包含 included 中的所有节点,并且包含在 restricted 节点以及 x, yincluded 的祖先节点的并集中。c) z 中不属于 included 的节点同时包含在 closure(x) 和 closure(y) 中。一个集合的闭包是图中通过有向路径连接到该集合的所有节点的集合。

复杂度是 \(O(m)\),其中 \(m\) 是由 xy 的祖先节点组成的 G 的子图中的边的数量。

详细信息,请参阅 [1]

参考文献

[1] (1,2)

van der Zander, Benito, and Maciej Liśkiewicz. “Finding minimal d-separators in linear time and applications.” In Uncertainty in Artificial Intelligence, pp. 637-647. PMLR, 2020.

示例

>>> G = nx.path_graph([0, 1, 2, 3], create_using=nx.DiGraph)
>>> G.add_node(4)
>>> nx.is_minimal_d_separator(G, 0, 2, {1})
True
>>> # since {1} is the minimal d-separator, {1, 3, 4} is not minimal
>>> nx.is_minimal_d_separator(G, 0, 2, {1, 3, 4})
False
>>> # alternatively, if we only want to check that {1, 3, 4} is a d-separator
>>> nx.is_d_separator(G, 0, 2, {1, 3, 4})
True