Spaces:
Running
Running
File size: 1,511 Bytes
b200bda |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
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._dispatch
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
|