docs: def marginalize(self, variables, inplace=True):
          """
          Marginalizes the factors present in the factor sets with respect to the given variables.
  
          Parameters
          ----------
          variables: list, array-like
              List of the variables to be marginalized.
  
          inplace: boolean (Default value True)
              If inplace=True it will modify the factor set itself, would create a new factor set
  
          Returns
          -------
          If inplace = False, will return a new marginalized FactorSet object.
  
          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)
          >>> factor_set1.marginalize('x1')
          >>> print(factor_set1)
          set([<DiscreteFactor representing phi(x2:3, x3:2) at 0x7f8e32b4cc10>,
               <DiscreteFactor representing phi(x3:2, x4:2) at 0x7f8e32b4cf90>])
          """
          if isinstance(variables, six.string_types):
              raise TypeError('Expected list or array-like type got type str')
  
          factor_set = self if inplace else self.copy()
  
          factors_to_be_marginalized = set(filter(lambda x: set(x.scope()).intersection(variables),
                                                  factor_set.factors))
  
          for factor in factors_to_be_marginalized:
              variables_to_be_marginalized = list(set(factor.scope()).intersection(variables))
              if inplace:
                  factor.marginalize(variables_to_be_marginalized, inplace=True)
              else:
                  factor_set.remove_factors(factor)
                  factor_set.add_factors(factor.marginalize(variables_to_be_marginalized, inplace=False))
  
          if not inplace:
              return factor_set