class_docstr: Composite features within a z-buffer using normalized weighted sum. Given a z-buffer
  with corresponding features and weights, these values are accumulated
  according to their weights such that depth is ignored; the weights are used to
  perform a weighted sum.
  
  Concretely this means:
      weighted_fs[b,c,i,j] =
       sum_k alphas[b,k,i,j] * features[c,pointsidx[b,k,i,j]] / sum_k alphas[b,k,i,j]
  
  Args:
      features: Packed Tensor of shape (C, P) giving the features of each point.
      alphas: float32 Tensor of shape (N, points_per_pixel, image_size,
          image_size) giving the weight of each point in the z-buffer.
          Values should be in the interval [0, 1].
      pointsidx: int32 Tensor of shape (N, points_per_pixel, image_size, image_size)
          giving the indices of the nearest points at each pixel, sorted in z-order.
          Concretely pointsidx[n, k, y, x] = p means that features[:, p] is the
          feature of the kth closest point (along the z-direction) to pixel (y, x) in
          batch element n. This is weighted by alphas[n, k, y, x].
  
  Returns:
      weighted_fs: Tensor of shape (N, C, image_size, image_size)
          giving the accumulated features at each point.
class_docstr_tok: ["Composite","features","within","a","z-buffer","using","normalized","weighted","sum",".","Given","a","z-buffer","with","corresponding","features","and","weights",",","these","values","are","accumulated","according","to","their","weights","such","that","depth","is","ignored",";","the","weights","are","used","to","perform","a","weighted","sum",".","Concretely","this","means",":","weighted_fs","[","b",",","c",",","i",",","j","]","=","sum_k","alphas","[","b",",","k",",","i",",","j","]","*","features","[","c",",","pointsidx","[","b",",","k",",","i",",","j","]","]","\/","sum_k","alphas","[","b",",","k",",","i",",","j","]","Args",":","features",":","Packed","Tensor","of","shape","(","C",",","P",")","giving","the","features","of","each","point",".","alphas",":","float32","Tensor","of","shape","(","N",",","points_per_pixel",",","image_size",",","image_size",")","giving","the","weight","of","each","point","in","the","z-buffer",".","Values","should","be","in","the","interval","[","0",",","1","]",".","pointsidx",":","int32","Tensor","of","shape","(","N",",","points_per_pixel",",","image_size",",","image_size",")","giving","the","indices","of","the","nearest","points","at","each","pixel",",","sorted","in","z-order",".","Concretely","pointsidx","[","n",",","k",",","y",",","x","]","=","p","means","that","features","[",":",",","p","]","is","the","feature","of","the","kth","closest","point","(","along","the","z-direction",")","to","pixel","(","y",",","x",")","in","batch","element","n.","This","is","weighted","by","alphas","[","n",",","k",",","y",",","x","]",".","Returns",":","weighted_fs",":","Tensor","of","shape","(","N",",","C",",","image_size",",","image_size",")","giving","the","accumulated","features","at","each","point","."]
code: def backward(ctx, grad_output):
      grad_features = None
      grad_alphas = None
      grad_points_idx = None
      features, alphas, points_idx = ctx.saved_tensors
  
      grad_features, grad_alphas = _C.accum_weightedsumnorm_backward(
          grad_output, features, alphas, points_idx
      )
  
      return grad_features, grad_alphas, grad_points_idx, None
  
file_path: pytorch3d/pytorch3d/renderer/compositing.py
imports: import torch
  from pytorch3d import _C
label_desc: Use image node_id 2 for calling the _CompositeNormWeightedSumPoints obj's underlying member method code with example usage: obj.backward(ctx, grad_output) and returns: grad_features,  grad_alphas,  grad_points_idx,  None