docs: def copy(self):
          """
          Returns a copy of ClusterGraph.
  
          Returns
          -------
          ClusterGraph: copy of ClusterGraph
  
          Examples
          -------
          >>> from pgmpy.factors.discrete import DiscreteFactor
          >>> G = ClusterGraph()
          >>> G.add_nodes_from([('a', 'b'), ('b', 'c')])
          >>> G.add_edge(('a', 'b'), ('b', 'c'))
          >>> phi1 = DiscreteFactor(['a', 'b'], [2, 2], np.random.rand(4))
          >>> phi2 = DiscreteFactor(['b', 'c'], [2, 2], np.random.rand(4))
          >>> G.add_factors(phi1, phi2)
          >>> graph_copy = G.copy()
          >>> graph_copy.factors
          [<DiscreteFactor representing phi(a:2, b:2) at 0xb71b19cc>,
           <DiscreteFactor representing phi(b:2, c:2) at 0xb4eaf3ac>]
          >>> graph_copy.edges()
          [(('a', 'b'), ('b', 'c'))]
          >>> graph_copy.nodes()
          [('a', 'b'), ('b', 'c')]
          """
          copy = ClusterGraph(self.edges())
          if self.factors:
              factors_copy = [factor.copy() for factor in self.factors]
              copy.add_factors(*factors_copy)
          return copy