text: # Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve.
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #    http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  import numpy as np
  import paddle
  from paddle import nn
  import paddle.nn.functional as F
  
  from paddleseg.cvlibs import manager
  
  
  @manager.LOSSES.add_component
  class MixedLoss(nn.Layer):
      """
      Weighted computations for multiple Loss.
      The advantage is that mixed loss training can be achieved without changing the networking code.
  
      Args:
          losses (list[nn.Layer]): A list consisting of multiple loss classes
          coef (list[float|int]): Weighting coefficient of multiple loss
  
      Returns:
          A callable object of MixedLoss.
      """
  
      def __init__(self, losses, coef):
          super(MixedLoss, self).__init__()
          if not isinstance(losses, list):
              raise TypeError('`losses` must be a list!')
          if not isinstance(coef, list):
              raise TypeError('`coef` must be a list!')
          len_losses = len(losses)
          len_coef = len(coef)
          if len_losses != len_coef:
              raise ValueError(
                  'The length of `losses` should equal to `coef`, but they are {} and {}.'
                  .format(len_losses, len_coef))
  
          self.losses = losses
          self.coef = coef
  
      def forward(self, logits, labels):
          loss_list = []
          for i, loss in enumerate(self.losses):
              output = loss(logits, labels)
              loss_list.append(output * self.coef[i])
          return loss_list
  