code: def gather(weights, indices, dim, output_shape=None):
    
    dim = convert_to_dimension(dim)
    output_shape = convert_to_shape(output_shape)
    if weights.dtype == tf.bool:
      return cast(gather(to_float(weights), indices, dim, output_shape), tf.bool)
    return einsum([one_hot(indices, dim, dtype=weights.dtype), weights],
                  reduced_dims=[dim], output_shape=output_shape)
docs: Shorthand for einsum([one_hot(indices, dim)], weights, reduced_dims=[dim]).
  
    Args:
      weights: a Tensor
      indices: a Tensor with integer type
      dim: a Dimension
      output_shape: an optional mtf.Shape
    Returns:
      a Tensor