code: def _get_queue_prototypes(self, high_resolution_features, epoch):
      if len(high_resolution_features) != len(self.queues):
          raise ValueError(
              f"The number of queues ({len(self.queues)}) should be equal to the number of high "
              f"resolution inputs ({len(high_resolution_features)}). Set `n_queues` accordingly."
          )
  
      # Get the queue features
      queue_features = []
      for i in range(len(self.queues)):
          _, features = self.queues[i](
              high_resolution_features[i], update=True
          )
          # Queue features are in (num_ftrs X queue_length) shape, while the high res
          # features are in (batch_size X num_ftrs). Swap the axes for interoperability.
          features = torch.permute(features, (1, 0))
          queue_features.append(features)
  
      # If loss calculation with queue prototypes starts at a later epoch,
      # just queue the features and return None instead of queue prototypes.
      if (
          self.start_queue_at_epoch > 0
          and epoch < self.start_queue_at_epoch
      ):
          return None
  
      # Assign prototypes
      queue_prototypes = [
          self.prototypes(x, epoch) for x in queue_features
      ]
      return queue_prototypes
  
file_path: lightly/examples/pytorch/swav_queue.py
imports: import torch
  import torchvision
  from torch import nn
  from lightly.loss import SwaVLoss
  from lightly.models.modules import SwaVProjectionHead, SwaVPrototypes
  from lightly.models.modules.memory_bank import MemoryBankModule
  from lightly.transforms.swav_transform import SwaVTransform
label_desc: Use image node_id 4 for calling the SwaV obj's underlying member method code with example usage: obj._get_queue_prototypes(high_resolution_features, epoch) and returns: queue_prototypes, None