class_docstr: This transform is used to shuffle the list of tensors (usually
  image patches of shape C x H x W) according to a randomly selected
  permutation from a pre-defined set of permutations.
  
  This is a common operation used in Jigsaw approach https://arxiv.org/abs/1603.09246
code: def _load_perms(self):
      if is_url(self.perm_file):
          temp_cache_dir = tempfile.mkdtemp()
          cache_dir = os.path.join(temp_cache_dir, "perm_file_cache")
          cached_url_path = cache_url(
              url=self.perm_file, cache_dir=cache_dir
          )
          self.perm_file = cached_url_path
      assert g_pathmgr.exists(
          self.perm_file
      ), f"Permutation file NOT found: {self.perm_file}"
      logging.info(f"Loading permutation: {self.perm_file}")
      self.perms = load_file(self.perm_file)
      if np.min(self.perms) == 1:
          self.perms = self.perms - 1
      logging.info(f"Loaded perm: {self.perms.shape}")
      self.perm_loaded = True
  
file_path: vissl/vissl/data/ssl_transforms/shuffle_img_patches.py
imports: import logging
  import os
  import tempfile
  from typing import Any, Dict
  import numpy
  import torch
  from classy_vision.dataset.transforms import register_transform
  from classy_vision.dataset.transforms.classy_transform import ClassyTransform
  from iopath.common.file_io import g_pathmgr
  from vissl.utils.io import cache_url, is_url, load_file
label_desc: Use image node_id 2 for calling the ShuffleImgPatches obj's underlying member method code with example usage: obj._load_perms() without return types