|
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 |
|
|