code: def forward(self, *args, **kwargs):
      self.output, outputs = self.apply_nn(self.input)
      if self.match is None:
          return self.output
  
      self.output_target, outputs_target = self.apply_nn(
          self.input_target
      )
      self.compute_loss()
  
      self.compute_intermediate_loss(outputs, outputs_target)
  
      return self.output
  
imports: import torch
  import torch.nn
  from torch.nn import LeakyReLU, Linear, Sequential
  from torch_geometric.nn.pool.consecutive import consecutive_cluster
  from torch_geometric.nn import voxel_grid
  from torch_geometric.data import Batch
  from torch_scatter import scatter_max, scatter_mean
  from torch_points3d.applications.sparseconv3d import SparseConv3d
  from torch_points3d.core.common_modules import FastBatchNorm1d, Seq
  from torch_points3d.core.common_modules import MLP
  from torch_points3d.models.registration.base import FragmentBaseModel
label_desc: Use image node_id 4 for calling the MS_SparseConv3d_Shared obj's underlying member method code with example usage: obj.forward() and returns: self, self