code: def forward(self, x, pos, batch, ptr):
      x = x if x is not None else pos
  
      b1_out = self.block1(self.fc0(x), pos, batch)
      b1_out_decimated, ptr1 = decimate(b1_out, ptr, self.decimation)
  
      b2_out = self.block2(*b1_out_decimated)
      b2_out_decimated, ptr2 = decimate(b2_out, ptr1, self.decimation)
  
      b3_out = self.block3(*b2_out_decimated)
      b3_out_decimated, ptr3 = decimate(b3_out, ptr2, self.decimation)
  
      b4_out = self.block4(*b3_out_decimated)
      b4_out_decimated, _ = decimate(b4_out, ptr3, self.decimation)
  
      mlp_out = (
          self.mlp_summit(b4_out_decimated[0]),
          b4_out_decimated[1],
          b4_out_decimated[2],
      )
  
      fp4_out = self.fp4(*mlp_out, *b3_out_decimated)
      fp3_out = self.fp3(*fp4_out, *b2_out_decimated)
      fp2_out = self.fp2(*fp3_out, *b1_out_decimated)
      fp1_out = self.fp1(*fp2_out, *b1_out)
  
      x = self.mlp_classif(fp1_out[0])
      logits = self.fc_classif(x)
  
      if self.return_logits:
          return logits
  
      probas = logits.log_softmax(dim=-1)
      return probas
  
imports: import os.path
  import torch
  import torch.nn.functional
  from randlanet_classification import DilatedResidualBlock, SharedMLP, decimate
  from torch.nn import Linear
  from torchmetrics.functional import jaccard_index
  from tqdm import tqdm
  import torch_geometric.transforms
  from torch_geometric.datasets import ShapeNet
  from torch_geometric.loader import DataLoader
  from torch_geometric.nn import knn_interpolate
  from torch_geometric.typing import WITH_TORCH_CLUSTER
  from torch_geometric.utils import scatter
label_desc: Use image node_id 2 for calling the Net obj's underlying member method code with example usage: obj.forward(x, pos, batch, ptr) and returns: probas, logits