class_docstr: When stride = 1, the block receives input with 2 * inp channels. Otherwise inp channels.
code: def _decode_point_depth_conv(self, sequence):
      result = []
      first_depth = first_point = True
      pc = c = self.channels
      for i, token in enumerate(sequence):
          # compute output channels of this conv
          if i + 1 == len(sequence):
              assert token == "p", "Last conv must be point-wise conv."
              c = self.oup_main
          elif token == "p" and first_point:
              c = self.mid_channels
          if token == "d":
              # depth-wise conv
              assert (
                  pc == c
              ), "Depth-wise conv must not change channels."
              result.append(
                  nn.Conv2d(
                      pc,
                      c,
                      self.ksize,
                      self.stride if first_depth else 1,
                      self.pad,
                      groups=c,
                      bias=False,
                  )
              )
              result.append(nn.BatchNorm2d(c, affine=self._affine))
              first_depth = False
          elif token == "p":
              # point-wise conv
              result.append(nn.Conv2d(pc, c, 1, 1, 0, bias=False))
              result.append(nn.BatchNorm2d(c, affine=self._affine))
              result.append(nn.ReLU(inplace=True))
              first_point = False
          else:
              raise ValueError("Conv sequence must be d and p.")
          pc = c
      return result
  
file_path: nni/examples/nas/legacy/oneshot/spos/blocks.py
imports: import torch
  import nni.retiarii.nn.pytorch
label_desc: Use image node_id 3 for calling the ShuffleNetBlock obj's underlying member method code with example usage: obj._decode_point_depth_conv(sequence) and returns: result