docs: def IoU(cm, ignore_index=None):
      """Calculates Intersection over Union
  
      Args:
          cm (ConfusionMatrix): instance of confusion matrix metric
          ignore_index (int, optional): index to ignore, e.g. background index
  
      Returns:
          MetricsLambda
  
      Examples:
  
      .. code-block:: python
  
          train_evaluator = ...
  
          cm = ConfusionMatrix(num_classes=num_classes)
          IoU(cm, ignore_index=0).attach(train_evaluator, 'IoU')
  
          state = train_evaluator.run(train_dataset)
          # state.metrics['IoU'] -> tensor of shape (num_classes - 1, )
  
      """
      if not isinstance(cm, ConfusionMatrix):
          raise TypeError("Argument cm should be instance of ConfusionMatrix, but given {}".format(type(cm)))
  
      if ignore_index is not None:
          if not (isinstance(ignore_index, numbers.Integral) and 0 <= ignore_index < cm.num_classes):
              raise ValueError("ignore_index should be non-negative integer, but given {}".format(ignore_index))
  
      # Increase floating point precision
      cm = cm.type(torch.float64)
      iou = cm.diag() / (cm.sum(dim=1) + cm.sum(dim=0) - cm.diag() + 1e-15)
      if ignore_index is not None:
  
          def ignore_index_fn(iou_vector):
              if ignore_index >= len(iou_vector):
                  raise ValueError("ignore_index {} is larger than the length of IoU vector {}"
                                   .format(ignore_index, len(iou_vector)))
              indices = list(range(len(iou_vector)))
              indices.remove(ignore_index)
              return iou_vector[indices]
  
          return MetricsLambda(ignore_index_fn, iou)
      else:
          return iou