class_docstr: VISSL wraps around transforms so that they work with the multimodal input.
  VISSL supports batches that come from several datasets and sources. Hence
  the input batch (images, labels) always is a list.
  
  To apply the user defined transforms, VISSL takes "indices" as input which
  defines on what dataset/source data in the sample should the transform be
  applied to. For example:
      Assuming input sample is {
          "data": [dataset1_imgX, dataset2_imgY],
          "label": [dataset1_lblX, dataset2_lblY]
      }
      and the transform is:
          TRANSFORMS:
              - name: RandomGrayscale
                p: 0.2
                indices: 0
      then the transform is applied only on dataset1_imgX. If however, the
      indices are either not specified or set to 0, 1 then the transform
      is applied on both dataset1_imgX and dataset2_imgY
  
  Since this structure of data is introduced by vissl, the SSLTransformsWrapper
  takes care of dealing with the multi-modality input by wrapping the
  original transforms (pytorch transforms or custom transforms defined by user)
  and calling each transform on each index.
  
  VISSL also supports _TRANSFORMS_WITH_LABELS transforms that modify the label
  or are used to generate the labels used in self-supervised learning tasks like
  Jigsaw. When the transforms in _TRANSFORMS_WITH_LABELS are called, the new
  label is also returned besides the transformed image.
  
  VISSL also supports the _TRANSFORMS_WITH_COPIES which are transforms
  that basically generate several copies of image. Common example
  of self-supervised training methods that do this is SimCLR, SwAV, MoCo etc
  When a transform from _TRANSFORMS_WITH_COPIES is used, the SSLTransformsWrapper
  will flatten the transform output.
  For example for the input [img1], if we apply ImgReplicatePil to replicate
  the image 2 times:
      SSLTransformsWrapper(
          ImgReplicatePil(num_times=2), [img1]
      )
      will output [img1_1, img1_2] instead of nested list [[img1_1, img1_2]].
  The benefit of this is that the next set of transforms specified by user can now
  operate on img1_1 and img1_2 as the input becomes multi-modal nature.
  
  VISSL also supports _TRANSFORMS_WITH_GROUPING which essentially means
  that a single transform should be applied on the full multi-modal input
  together instead of separately. This is common transform used in BYOL/
  For example:
      SSLTransformsWrapper(
          ImgPilMultiCropRandomApply(
              RandomApply, prob=[0.0, 0.2]
          ), [img1_1, img1_2]
      )
      this will apply RandomApply on img1_1 with prob=0.0 and on img1_2 with
      prob=0.2
docstr: _TRANSFORMS_WITH_LABELS = ["ImgRotatePil", "ShuffleImgPatches"]
docstr_tok: ["_TRANSFORMS_WITH_LABELS","=","[","``","ImgRotatePil","''",",","``","ShuffleImgPatches","''","]"]
code: def _is_transform_with_labels(self):
      """
      _TRANSFORMS_WITH_LABELS = ["ImgRotatePil", "ShuffleImgPatches"]
      """
      return self.name in self.transforms_with_labels
  
file_path: vissl/vissl/data/ssl_transforms/ssl_transforms_wrapper.py
imports: from typing import Any, Dict
  from classy_vision.dataset.transforms import build_transform, register_transform
  from classy_vision.dataset.transforms.classy_transform import ClassyTransform
  from vissl.utils.misc import is_augly_available
label_desc: Use image node_id 4 for calling the SSLTransformsWrapper obj's underlying member method code with example usage: obj._is_transform_with_labels() and returns: unknown