text: # Modification 2020 RangiLyu
  # Copyright 2018-2019 Open-MMLab.
  
  # 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.
  
  from functools import partial
  
  import torch
  
  
  def multi_apply(func, *args, **kwargs):
      pfunc = partial(func, **kwargs) if kwargs else func
      map_results = map(pfunc, *args)
      return tuple(map(list, zip(*map_results)))
  
  
  def images_to_levels(target, num_level_anchors):
      """Convert targets by image to targets by feature level.
  
      [target_img0, target_img1] -> [target_level0, target_level1, ...]
      """
      target = torch.stack(target, 0)
      level_targets = []
      start = 0
      for n in num_level_anchors:
          end = start + n
          level_targets.append(target[:, start:end].squeeze(0))
          start = end
      return level_targets
  
  
  def unmap(data, count, inds, fill=0):
      """Unmap a subset of item (data) back to the original set of items (of
      size count)"""
      if data.dim() == 1:
          ret = data.new_full((count,), fill)
          ret[inds.type(torch.bool)] = data
      else:
          new_size = (count,) + data.size()[1:]
          ret = data.new_full(new_size, fill)
          ret[inds.type(torch.bool), :] = data
      return ret
  