docs: def sum(self, phi1, inplace=True):
          """
          DiscreteFactor sum with `phi1`.
  
          Parameters
          ----------
          phi1: `DiscreteFactor` instance.
              DiscreteFactor to be added.
  
          inplace: boolean
              If inplace=True it will modify the factor itself, else would return
              a new factor.
  
          Returns
          -------
          DiscreteFactor or None: if inplace=True (default) returns None
                          if inplace=False returns a new `DiscreteFactor` instance.
  
          Example
          -------
          >>> 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))
          >>> phi1.sum(phi2, inplace=True)
          >>> phi1.variables
          ['x1', 'x2', 'x3', 'x4']
          >>> phi1.cardinality
          array([2, 3, 2, 2])
          >>> phi1.values
          array([[[[ 0,  0],
                   [ 4,  6]],
  
                  [[ 0,  4],
                   [12, 18]],
  
                  [[ 0,  8],
                   [20, 30]]],
  
  
                 [[[ 6, 18],
                   [35, 49]],
  
                  [[ 8, 24],
                   [45, 63]],
  
                  [[10, 30],
                   [55, 77]]]])
          """
          phi = self if inplace else self.copy()
          if isinstance(phi1, (int, float)):
              phi.values += phi1
          else:
              phi1 = phi1.copy()
  
              # modifying phi to add new variables
              extra_vars = set(phi1.variables) - set(phi.variables)
              if extra_vars:
                  slice_ = [slice(None)] * len(phi.variables)
                  slice_.extend([np.newaxis] * len(extra_vars))
                  phi.values = phi.values[tuple(slice_)]
  
                  phi.variables.extend(extra_vars)
  
                  new_var_card = phi1.get_cardinality(extra_vars)
                  phi.cardinality = np.append(phi.cardinality, [new_var_card[var] for var in extra_vars])
  
              # modifying phi1 to add new variables
              extra_vars = set(phi.variables) - set(phi1.variables)
              if extra_vars:
                  slice_ = [slice(None)] * len(phi1.variables)
                  slice_.extend([np.newaxis] * len(extra_vars))
                  phi1.values = phi1.values[tuple(slice_)]
  
                  phi1.variables.extend(extra_vars)
                  # No need to modify cardinality as we don't need it.
  
              # rearranging the axes of phi1 to match phi
              for axis in range(phi.values.ndim):
                  exchange_index = phi1.variables.index(phi.variables[axis])
                  phi1.variables[axis], phi1.variables[exchange_index] = phi1.variables[exchange_index], \
                      phi1.variables[axis]
                  phi1.values = phi1.values.swapaxes(axis, exchange_index)
  
              phi.values = phi.values + phi1.values
  
          if not inplace:
              return phi