class_docstr: Helper class for decomposing conv3d with temporal kernel of 3 into equivalent conv2ds.
  In conv3d with temporal kernel 3 and input I, for output temporal index of t (O[:,:,t,:,:]),
  the conv can be expressed as:
  O[:,:,t,:,:] = conv3d(I[:,:,t:t+3,:,:])
               = conv2d_0(I[:,:,t,:,:]) + conv2d_1(I[:,:,t+1,:,:]) + conv2d_2(I[:,:,t+2,:,:])
  If bias is considered:
  O[:,:,t,:,:] = conv3d_w_bias(I[:,:,t:t+3,:,:])
               = conv2d_0_wo_bias(I[:,:,t,:,:])
                 + conv2d_1_w_bias(I[:,:,t+1,:,:]) + conv2d_2_wo_bias(I[:,:,t+2,:,:])
  The input Conv3d also needs zero padding of size 1 in temporal dimension.
class_docstr_tok: ["Helper","class","for","decomposing","conv3d","with","temporal","kernel","of","3","into","equivalent","conv2ds",".","In","conv3d","with","temporal","kernel","3","and","input","I",",","for","output","temporal","index","of","t","(","O","[",":",",",":",",t",",",":",",",":","]",")",",","the","conv","can","be","expressed","as",":","O","[",":",",",":",",t",",",":",",",":","]","=","conv3d","(","I","[",":",",",":",",t",":","t+3",",",":",",",":","]",")","=","conv2d_0","(","I","[",":",",",":",",t",",",":",",",":","]",")","+","conv2d_1","(","I","[",":",",",":",",t+1",",",":",",",":","]",")","+","conv2d_2","(","I","[",":",",",":",",t+2",",",":",",",":","]",")","If","bias","is","considered",":","O","[",":",",",":",",t",",",":",",",":","]","=","conv3d_w_bias","(","I","[",":",",",":",",t",":","t+3",",",":",",",":","]",")","=","conv2d_0_wo_bias","(","I","[",":",",",":",",t",",",":",",",":","]",")","+","conv2d_1_w_bias","(","I","[",":",",",":",",t+1",",",":",",",":","]",")","+","conv2d_2_wo_bias","(","I","[",":",",",":",",t+2",",",":",",",":","]",")","The","input","Conv3d","also","needs","zero","padding","of","size","1","in","temporal","dimension","."]
docstr: Use three conv2d to emulate conv3d.
  This forward assumes zero padding of size 1 in temporal dimension.
docstr_tok: ["Use","three","conv2d","to","emulate","conv3d",".","This","forward","assumes","zero","padding","of","size","1","in","temporal","dimension","."]
code: def forward(self, x):
      """
      Use three conv2d to emulate conv3d.
      This forward assumes zero padding of size 1 in temporal dimension.
      """
      if self._input_THW_tuple[0] > 1:
          out_tensor_list = []
          """
              First output plane in temporal dimension,
              conv2d_3_3_0 is skipped due to zero padding.
              """
          cur_tensor = (
              self._add_funcs[0]
              .add(
                  self._conv2d_3_3_1(x[:, :, 0]),
                  self._conv2d_3_3_2(x[:, :, 1]),
              )
              .unsqueeze(2)
          )
          out_tensor_list.append(cur_tensor)
          for idx in range(2, self._input_THW_tuple[0]):
              cur_tensor = (
                  self._add_funcs[2 * idx - 3]
                  .add(
                      self._add_funcs[2 * idx - 2].add(
                          self._conv2d_3_3_0(x[:, :, idx - 2]),
                          self._conv2d_3_3_1(x[:, :, idx - 1]),
                      ),
                      self._conv2d_3_3_2(x[:, :, idx]),
                  )
                  .unsqueeze(2)
              )
              out_tensor_list.append(cur_tensor)
          """
              Last output plane in temporal domain, conv2d_3_3_2 is skipped due to zero padding.
              """
          cur_tensor = (
              self._add_funcs[-1]
              .add(
                  self._conv2d_3_3_0(x[:, :, -2]),
                  self._conv2d_3_3_1(x[:, :, -1]),
              )
              .unsqueeze(2)
          )
          out_tensor_list.append(cur_tensor)
          return self._cat_func.cat(out_tensor_list, 2)
      else:  # Degenerated to simple conv2d
          return self._conv2d_3_3_1(x[:, :, 0]).unsqueeze(2)
  
imports: from copy import deepcopy
  from typing import Tuple
  import torch
  import torch.nn
label_desc: Use image node_id 2 for calling the _Conv3dTemporalKernel3Decomposed obj's underlying member method code with example usage: obj.forward(x) and returns: self, self