docs: def broadcast(cls,
              shape1: 'TensorFluentShape',
              shape2: 'TensorFluentShape') -> Tuple[Reshaping, Reshaping]:
          '''It broadcasts the fluent shapes if any input is in batch mode.
  
          It handles input shapes in different modes, expanding its
          dimensions if necessary. It outputs a tuple with new shapes.
          If no input shape is in batch mode, return (None, None).
          If an input shape does not need to be changed, return None.
  
          Args:
              shape1: A fluent's shape.
              shape2: A fluent's shape.
  
          Returns:
              A pair of new shapes.
          '''
          reshape_1, reshape_2 = None, None
  
          if not (shape1._batch or shape2._batch):
              return reshape_1, reshape_2
  
          size_1, size_2 = shape1.fluent_size, shape2.fluent_size
          size_diff = abs(size_1 - size_2)
          if size_diff == 0:
              return reshape_1, reshape_2
  
          if size_2 > size_1 and not (size_1 == 0 and not shape1._batch):
              reshape_1 = [1] * size_diff + list(shape1.fluent_shape)
              if shape1._batch:
                  reshape_1 = [shape1.batch_size] + reshape_1
          elif size_1 > size_2 and not (size_2 == 0 and not shape2._batch):
              reshape_2 = [1] * size_diff + list(shape2.fluent_shape)
              if shape2._batch:
                  reshape_2 = [shape2.batch_size] + reshape_2
          return reshape_1, reshape_2