| r"""Function for computing the moral graph of a directed graph.""" |
|
|
| import itertools |
|
|
| import networkx as nx |
| from networkx.utils import not_implemented_for |
|
|
| __all__ = ["moral_graph"] |
|
|
|
|
| @not_implemented_for("undirected") |
| @nx._dispatchable(returns_graph=True) |
| def moral_graph(G): |
| r"""Return the Moral Graph |
| |
| Returns the moralized graph of a given directed graph. |
| |
| Parameters |
| ---------- |
| G : NetworkX graph |
| Directed graph |
| |
| Returns |
| ------- |
| H : NetworkX graph |
| The undirected moralized graph of G |
| |
| Raises |
| ------ |
| NetworkXNotImplemented |
| If `G` is undirected. |
| |
| Examples |
| -------- |
| >>> G = nx.DiGraph([(1, 2), (2, 3), (2, 5), (3, 4), (4, 3)]) |
| >>> G_moral = nx.moral_graph(G) |
| >>> G_moral.edges() |
| EdgeView([(1, 2), (2, 3), (2, 5), (2, 4), (3, 4)]) |
| |
| Notes |
| ----- |
| A moral graph is an undirected graph H = (V, E) generated from a |
| directed Graph, where if a node has more than one parent node, edges |
| between these parent nodes are inserted and all directed edges become |
| undirected. |
| |
| https://en.wikipedia.org/wiki/Moral_graph |
| |
| References |
| ---------- |
| .. [1] Wray L. Buntine. 1995. Chain graphs for learning. |
| In Proceedings of the Eleventh conference on Uncertainty |
| in artificial intelligence (UAI'95) |
| """ |
| H = G.to_undirected() |
| for preds in G.pred.values(): |
| predecessors_combinations = itertools.combinations(preds, r=2) |
| H.add_edges_from(predecessors_combinations) |
| return H |
|
|