docs: def get_partition_function(self):
          r"""
          Returns the partition function for a given undirected graph.
  
          A partition function is defined as
  
          .. math:: \sum_{X}(\prod_{i=1}^{m} \phi_i)
  
          where m is the number of factors present in the graph
          and X are all the random variables present.
  
          Examples
          --------
          >>> from pgmpy.models import ClusterGraph
          >>> from pgmpy.factors.discrete import DiscreteFactor
          >>> G = ClusterGraph()
          >>> G.add_nodes_from([('a', 'b', 'c'), ('a', 'b'), ('a', 'c')])
          >>> G.add_edges_from([(('a', 'b', 'c'), ('a', 'b')),
          ...                   (('a', 'b', 'c'), ('a', 'c'))])
          >>> phi1 = DiscreteFactor(['a', 'b', 'c'], [2, 2, 2], np.random.rand(8))
          >>> phi2 = DiscreteFactor(['a', 'b'], [2, 2], np.random.rand(4))
          >>> phi3 = DiscreteFactor(['a', 'c'], [2, 2], np.random.rand(4))
          >>> G.add_factors(phi1, phi2, phi3)
          >>> G.get_partition_function()
          """
          if self.check_model():
              factor = self.factors[0]
              factor = factor_product(factor, *[self.factors[i] for i in range(1, len(self.factors))])
              return np.sum(factor.values)