code: def _calculate_giou(
      b1: TensorLike, b2: TensorLike, mode: str = "giou"
  ) -> tf.Tensor:
      """
      Args:
          b1: bounding box. The coordinates of the each bounding box in boxes are
              encoded as [y_min, x_min, y_max, x_max].
          b2: the other bounding box. The coordinates of the each bounding box
              in boxes are encoded as [y_min, x_min, y_max, x_max].
          mode: one of ['giou', 'iou'], decided to calculate GIoU or IoU loss.
  
      Returns:
          GIoU loss float `Tensor`.
      """
      zero = tf.convert_to_tensor(0.0, b1.dtype)
      b1_ymin, b1_xmin, b1_ymax, b1_xmax = tf.unstack(b1, 4, axis=-1)
      b2_ymin, b2_xmin, b2_ymax, b2_xmax = tf.unstack(b2, 4, axis=-1)
      b1_width = tf.maximum(zero, b1_xmax - b1_xmin)
      b1_height = tf.maximum(zero, b1_ymax - b1_ymin)
      b2_width = tf.maximum(zero, b2_xmax - b2_xmin)
      b2_height = tf.maximum(zero, b2_ymax - b2_ymin)
      b1_area = b1_width * b1_height
      b2_area = b2_width * b2_height
  
      intersect_ymin = tf.maximum(b1_ymin, b2_ymin)
      intersect_xmin = tf.maximum(b1_xmin, b2_xmin)
      intersect_ymax = tf.minimum(b1_ymax, b2_ymax)
      intersect_xmax = tf.minimum(b1_xmax, b2_xmax)
      intersect_width = tf.maximum(
          zero, intersect_xmax - intersect_xmin
      )
      intersect_height = tf.maximum(
          zero, intersect_ymax - intersect_ymin
      )
      intersect_area = intersect_width * intersect_height
  
      union_area = b1_area + b2_area - intersect_area
      iou = tf.math.divide_no_nan(intersect_area, union_area)
      if mode == "iou":
          return iou
  
      enclose_ymin = tf.minimum(b1_ymin, b2_ymin)
      enclose_xmin = tf.minimum(b1_xmin, b2_xmin)
      enclose_ymax = tf.maximum(b1_ymax, b2_ymax)
      enclose_xmax = tf.maximum(b1_xmax, b2_xmax)
      enclose_width = tf.maximum(zero, enclose_xmax - enclose_xmin)
      enclose_height = tf.maximum(zero, enclose_ymax - enclose_ymin)
      enclose_area = enclose_width * enclose_height
      giou = iou - tf.math.divide_no_nan(
          (enclose_area - union_area), enclose_area
      )
      return giou
  
file_path: addons/tensorflow_addons/losses/giou_loss.py
imports: from typing import Optional
  import tensorflow
  from typeguard import typechecked
  from tensorflow_addons.utils.keras_utils import LossFunctionWrapper
  from tensorflow_addons.utils.types import TensorLike
label_desc: Use image node_id 2 for calling a global function with example usage: _calculate_giou(b1, b2, mode) and returns: giou, iou