docs: def moralize(self):
          """
          Removes all the immoralities in the DAG and creates a moral
          graph (UndirectedGraph).
  
          A v-structure X->Z<-Y is an immorality if there is no directed edge
          between X and Y.
  
          Examples
          --------
          >>> from pgmpy.base import DAG
          >>> G = DAG(ebunch=[('diff', 'grade'), ('intel', 'grade')])
          >>> moral_graph = G.moralize()
          >>> moral_graph.edges()
          [('intel', 'grade'), ('intel', 'diff'), ('grade', 'diff')]
          """
          moral_graph = UndirectedGraph(self.to_undirected().edges())
  
          for node in self.nodes():
              moral_graph.add_edges_from(
                  itertools.combinations(self.get_parents(node), 2))
  
          return moral_graph