チェーンコンポーネントを定義する同値関係は、Drton 2009によって次のようになります。2つの頂点v_0
を定義v_k
し、チェーングラフGで、すべての0≤i≤k−1に対してGにパスが存在する場合に同等になるように(v_0,..., v_k)
定義しv_i − v_{i+1}
ます。
この同値関係の下の同値類は、Gのチェーンコンポーネントです。大まかに言えば、これは、チェーングラフの無向エッジから作成されたグラフのすべての連結成分、および有向エッジのみで入射するすべてのノード、および隣人がまったくいない、これはピーターの答えに相当します
これは、Cowell 2005、Probabilistic Networks、および...、pで与えられたチェーングラフCH-Asiaを正しく分解する関数です。110図6.1。これは、私が趣味のプロジェクトとして開発しているグラフィカルモデルライブラリの一部です。
カスタムデータ構造を使用しますが、グラフィカルモデルを含む他のコードベースに適応するのはそれほど難しくありません。
def get_chain_components(self) -> Set[Set[Node]]:
"""!
"""
# filter out undirected edges
edges = set()
for e in self.edges():
if e.type() == EdgeType.UNDIRECTED:
edges.add(e)
# make a graph from undirected edges
undi = UndiGraph.from_graph(Graph.from_edge_node_set(edges, self.nodes()))
return undi.get_components_as_node_set()