code: def _infer_binary_broadcast_shape(shape1, shape2, given_output_shape=None):
    
    shape1 = convert_to_shape(shape1)
    shape2 = convert_to_shape(shape2)
    given_output_shape = convert_to_shape(given_output_shape)
    if given_output_shape is not None:
      return given_output_shape
    if is_subsequence(shape1.dims, shape2.dims):
      return shape2
    if is_subsequence(shape2.dims, shape1.dims):
      return shape1
    return Shape(
        shape1.dims + [d for d in shape2.dims if d not in shape1.dims])
docs: Infer shape of the output of a binary op with broadcasting.
  
    If the output shape is not given with given_output_shape, then we check
    to see if one of the shapes is a subsequence of the other one, and we
    return the one that is the supersequence.  Otherwise, we list the dimensions
    of shape1, followed by all new dimensions in shape2.
  
    Args:
      shape1: a Shape
      shape2: a Shape
      given_output_shape: an optional Shape
    Returns:
      a Shape