code: def weight_reduce_loss(
      loss: Tensor,
      weight: Optional[Tensor] = None,
      reduction: str = "mean",
      avg_factor: Optional[float] = None,
  ) -> Tensor:
      """Apply element-wise weight and reduce loss.
  
      Args:
          loss (Tensor): Element-wise loss.
          weight (Optional[Tensor], optional): Element-wise weights.
              Defaults to None.
          reduction (str, optional): Same as built-in losses of PyTorch.
              Defaults to 'mean'.
          avg_factor (Optional[float], optional): Average factor when
              computing the mean of losses. Defaults to None.
  
      Returns:
          Tensor: Processed loss values.
      """
      # if weight is specified, apply element-wise weight
      if weight is not None:
          loss = loss * weight
  
      # if avg_factor is not specified, just reduce the loss
      if avg_factor is None:
          loss = reduce_loss(loss, reduction)
      else:
          # if reduction is mean, then average the loss by avg_factor
          if reduction == "mean":
              # Avoid causing ZeroDivisionError when avg_factor is 0.0,
              # i.e., all labels of an image belong to ignore index.
              eps = torch.finfo(torch.float32).eps
              loss = loss.sum() / (avg_factor + eps)
          # if reduction is 'none', then do nothing, otherwise raise an error
          elif reduction != "none":
              raise ValueError(
                  'avg_factor can not be used with reduction="sum"'
              )
      return loss
  
file_path: mmdetection/mmdet/models/losses/utils.py
imports: import functools
  from typing import Callable, Optional
  import torch
  import torch.nn.functional
  from torch import Tensor
label_desc: Use image node_id 2 for calling a global function with example usage: weight_reduce_loss(loss, weight, reduction, avg_factor) and returns: loss