docs: def product(self, factorset, inplace=True):
          r"""
          Return the factor sets product with the given factor sets
  
          Suppose :math:`\vec\phi_1` and :math:`\vec\phi_2` are two factor sets then their product is a another factors
          set :math:`\vec\phi_3 = \vec\phi_1 \cup \vec\phi_2`.
  
          Parameters
          ----------
          factorsets: FactorSet1, FactorSet2, ..., FactorSetn
              FactorSets to be multiplied
  
          inplace: A boolean (Default value True)
              If inplace = True , then it will modify the FactorSet object, if False, it will
              return a new FactorSet object.
  
          Returns
          --------
          If inpalce = False, will return a new FactorSet object, which is product of two factors
  
          Examples
          --------
          >>> from pgmpy.factors import FactorSet
          >>> from pgmpy.factors.discrete import DiscreteFactor
          >>> phi1 = DiscreteFactor(['x1', 'x2', 'x3'], [2, 3, 2], range(12))
          >>> phi2 = DiscreteFactor(['x3', 'x4', 'x1'], [2, 2, 2], range(8))
          >>> factor_set1 = FactorSet(phi1, phi2)
          >>> phi3 = DiscreteFactor(['x5', 'x6', 'x7'], [2, 2, 2], range(8))
          >>> phi4 = DiscreteFactor(['x5', 'x7', 'x8'], [2, 2, 2], range(8))
          >>> factor_set2 = FactorSet(phi3, phi4)
          >>> print(factor_set2)
          set([<DiscreteFactor representing phi(x5:2, x6:2, x7:2) at 0x7f8e32b5b050>,
               <DiscreteFactor representing phi(x5:2, x7:2, x8:2) at 0x7f8e32b5b690>])
          >>> factor_set2.product(factor_set1)
          >>> print(factor_set2)
          set([<DiscreteFactor representing phi(x1:2, x2:3, x3:2) at 0x7f8e32b4c910>,
               <DiscreteFactor representing phi(x3:2, x4:2, x1:2) at 0x7f8e32b4cc50>,
               <DiscreteFactor representing phi(x5:2, x6:2, x7:2) at 0x7f8e32b5b050>,
               <DiscreteFactor representing phi(x5:2, x7:2, x8:2) at 0x7f8e32b5b690>])
          >>> factor_set2 = FactorSet(phi3, phi4)
          >>> factor_set3 = factor_set2.product(factor_set1, inplace=False)
          >>> print(factor_set2)
          set([<DiscreteFactor representing phi(x5:2, x6:2, x7:2) at 0x7f8e32b5b060>,
               <DiscreteFactor representing phi(x5:2, x7:2, x8:2) at 0x7f8e32b5b790>])
          """
          factor_set = self if inplace else self.copy()
          factor_set1 = factorset.copy()
  
          factor_set.add_factors(*factor_set1.factors)
  
          if not inplace:
              return factor_set