code: def combine(self, expert_out, multiply_by_gates=True):
      
      expert_part_sizes = tf.unstack(
          tf.stack([d.part_sizes for d in self._dispatchers]),
          num=self._ep.n,
          axis=1)
      # list of lists of shape [num_experts][num_datashards]
      expert_output_parts = self._ep(tf.split, expert_out, expert_part_sizes)
      expert_output_parts_t = transpose_list_of_lists(expert_output_parts)
      def my_combine(dispatcher, parts):
        return dispatcher.combine(
            common_layers.convert_gradient_to_tensor(tf.concat(parts, 0)),
            multiply_by_gates=multiply_by_gates)
      return self._dp(my_combine, self._dispatchers, expert_output_parts_t)
docs: Sum together the expert output, multiplied by the corresponding gates.
  
      Args:
        expert_out: a list of `num_experts` `Tensor`s, each with shape
          `[expert_batch_size_i, <extra_output_dims>]`.
        multiply_by_gates: a boolean.
  
      Returns:
        a list of num_datashards `Tensor`s with shapes
          `[batch_size[d], <extra_output_dims>]`.