text: Title: cross_batch_memory The implementation does not appear to be a queue data structure
  Body: `        if end_idx > self.queue_idx:
              self.embedding_memory[self.queue_idx:end_idx] = embeddings.detach()
              self.label_memory[self.queue_idx:end_idx] = labels.detach()            
          else:
              se = self.memory_size-self.queue_idx
              self.embedding_memory[self.queue_idx:] = embeddings[:se].detach()
              self.embedding_memory[:end_idx] = embeddings[se:].detach()
              self.label_memory[self.queue_idx:] = labels[:se].detach()
              self.label_memory[:end_idx] = labels[se:].detach()`
  
  When the memory is full, the queue head is always replaced, but the queue head is replaced with the most recent batch, so the last half of the queue remains unchanged, without the first-in-first-out feature of the queue.