docstr: Run forward pass.
  Input --- D1 -- D2 -- D3 -- U1 -- U2 -- output
             |      |_________|     |
             |______________________|
  
  Parameters
  -----------
  data
      A SparseTensor that contains the data itself and its metadata information. Should contain
          F -- Features [N, C]
          coords -- Coords [N, 4]
  
  Returns
  --------
  data:
      - pos [N, 3] (coords or real pos if xyz is in data)
      - x [N, output_nc]
      - batch [N]
docstr_tok: ["Run","forward","pass",".","Input","--","-","D1","--","D2","--","D3","--","U1","--","U2","--","output","|","|_________|","|","|______________________|","Parameters","--","--","--","--","--","-","data","A","SparseTensor","that","contains","the","data","itself","and","its","metadata","information",".","Should","contain","F","--","Features","[","N",",","C","]","coords","--","Coords","[","N",",","4","]","Returns","--","--","--","--","data",":","-","pos","[","N",",","3","]","(","coords","or","real","pos","if","xyz","is","in","data",")","-","x","[","N",",","output_nc","]","-","batch","[","N","]"]
code: def forward(self, data, *args, **kwargs):
      """Run forward pass.
      Input --- D1 -- D2 -- D3 -- U1 -- U2 -- output
                 |      |_________|     |
                 |______________________|
  
      Parameters
      -----------
      data
          A SparseTensor that contains the data itself and its metadata information. Should contain
              F -- Features [N, C]
              coords -- Coords [N, 4]
  
      Returns
      --------
      data:
          - pos [N, 3] (coords or real pos if xyz is in data)
          - x [N, output_nc]
          - batch [N]
      """
      self._set_input(data)
      data = self.input
      stack_down = []
      for i in range(len(self.down_modules) - 1):
          data = self.down_modules[i](data)
          stack_down.append(data)
  
      data = self.down_modules[-1](data)
      stack_down.append(None)
      # TODO : Manage the inner module
      for i in range(len(self.up_modules)):
          data = self.up_modules[i](data, stack_down.pop())
  
      out = Batch(x=data.F, pos=self.xyz).to(self.device)
      if self.has_mlp_head:
          out.x = self.mlp(out.x)
      return out
  
imports: import os
  import sys
  from omegaconf import DictConfig, OmegaConf
  import logging
  import torch
  from torch_geometric.data import Batch
  from torch_points3d.applications.modelfactory import ModelFactory
  import torch_points3d.modules.SparseConv3d
  from torch_points3d.core.base_conv.message_passing import *
  from torch_points3d.modules.SparseConv3d.modules import *
  from torch_points3d.core.base_conv.partial_dense import *
  from torch_points3d.models.base_architectures.unet import UnwrappedUnetBasedModel
  from torch_points3d.core.common_modules.base_modules import MLP
  from .utils import extract_output_nc
label_desc: Use image node_id 1 for calling the SparseConv3dUnet obj's underlying member method code with example usage: obj.forward(data) and returns: out