
    h                     l    S r SSKrSSKrSSKJr  S/r\" S5      \R                  " SS9S 5       5       rg)	z;Function for computing the moral graph of a directed graph.    N)not_implemented_formoral_graph
undirectedT)returns_graphc                     U R                  5       nU R                  R                  5        H)  n[        R                  " USS9nUR                  U5        M+     U$ )a  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)
   )r)to_undirectedpredvalues	itertoolscombinationsadd_edges_from)GHpredspredecessors_combinationss       K/var/www/html/env/lib/python3.13/site-packages/networkx/algorithms/moral.pyr   r      sN    X 	
A$-$:$:5A$F!	23 ! H    )	__doc__r   networkxnxnetworkx.utilsr   __all___dispatchabler    r   r   <module>r      sD    B   ./ \"%. & #.r   