class_docstr: CenterPivot 4D conv
  
  Args:
      in_channels (`int`):
          Number of input channels.
      out_channels (`int`):
          Number of output channels.
      kernel_size (`list or tuple`):
          Numbers for kernel size.
      stride (`list or tuple`):
          Numbers for stride.
      padding (`list or tuple`):
          Numbers for padding.
      bias (`bool`):
          Whether to add bias for conv layer.
code: def forward(self, x):
      if self.stride[2:][-1] > 1:
          out1 = self.prune(x)
      else:
          out1 = x
      bsz, inch, ha, wa, hb, wb = out1.size()
      out1 = (
          out1.permute(0, 4, 5, 1, 2, 3)
          .contiguous()
          .view(-1, inch, ha, wa)
      )
      out1 = self.conv1(out1)
      outch, o_ha, o_wa = out1.size(-3), out1.size(-2), out1.size(-1)
      out1 = (
          out1.view(bsz, hb, wb, outch, o_ha, o_wa)
          .permute(0, 3, 4, 5, 1, 2)
          .contiguous()
      )
  
      if self.stride[:2][-1] > 1:
          out2 = self.prune_out2(x)
      else:
          out2 = x
      bsz, inch, ha, wa, hb, wb = out2.size()
      out2 = (
          out2.permute(0, 2, 3, 1, 4, 5)
          .contiguous()
          .view(-1, inch, hb, wb)
      )
      out2 = self.conv2(out2)
      outch, o_hb, o_wb = out2.size(-3), out2.size(-2), out2.size(-1)
      out2 = (
          out2.view(bsz, ha, wa, outch, o_hb, o_wb)
          .permute(0, 3, 1, 2, 4, 5)
          .contiguous()
      )
      if out1.size()[-2:] != out2.size()[-2:] and self.padding[-2:] == (
          0,
          0,
      ):
          out1 = out1.view(bsz, outch, o_ha, o_wa, -1).sum(dim=-1)
          out2 = out2.squeeze()
      y = out1 + out2
      return y
  
imports: import torch
  from torch import nn
label_desc: Use image node_id 4 for calling the CenterPivotConv4d obj's underlying member method code with example usage: obj.forward(x) and returns: y