docstr: Propagates features from one layer to the next.
  data contains information from the down convs in data_skip
  
  Arguments:
      data -- (data, data_skip)
docstr_tok: ["Propagates","features","from","one","layer","to","the","next",".","data","contains","information","from","the","down","convs","in","data_skip","Arguments",":","data","--","(","data",",","data_skip",")"]
code: def forward(self, data, **kwargs):
      """Propagates features from one layer to the next.
      data contains information from the down convs in data_skip
  
      Arguments:
          data -- (data, data_skip)
      """
      data, data_skip = data
      pos, x = data.pos, data.x
      pos_skip, x_skip = data_skip.pos, data_skip.x
  
      new_features = self.conv(pos, pos_skip, x)
  
      if x_skip is not None:
          new_features = torch.cat(
              [new_features, x_skip], dim=1
          )  # (B, C2 + C1, n)
  
      new_features = new_features.unsqueeze(-1)
  
      if hasattr(self, "nn"):
          new_features = self.nn(new_features)
  
      return Data(x=new_features.squeeze(-1), pos=pos_skip)
  
imports: import numpy
  import torch
  from torch.nn import Linear, ReLU, LeakyReLU, BatchNorm1d, Dropout
  from torch_geometric.nn import knn_interpolate, fps, radius, global_max_pool, global_mean_pool, knn
  from torch_geometric.data import Data
  import torch_points_kernels
  from torch_points3d.core.spatial_ops import BaseMSNeighbourFinder
  from torch_points3d.core.base_conv import BaseConvolution
  from torch_points3d.core.common_modules.dense_modules import MLP2D
  from torch_points3d.utils.enums import ConvolutionFormat
  from torch_points3d.utils.model_building_utils.activation_resolver import get_activation
label_desc: Use image node_id 3 for calling the BaseDenseConvolutionUp obj's underlying member method code with example usage: obj.forward(data) and returns: Data