code: def __iter__(self):
      while True:
          heads = torch.randint(
              0, self.g.num_nodes(self.item_type), (self.batch_size,)
          )
          tails = dgl.sampling.random_walk(
              self.g,
              heads,
              metapath=[
                  self.item_to_user_etype,
                  self.user_to_item_etype,
              ],
          )[0][:, 2]
          neg_tails = torch.randint(
              0, self.g.num_nodes(self.item_type), (self.batch_size,)
          )
  
          mask = tails != -1
          yield heads[mask], tails[mask], neg_tails[mask]
  
imports: import argparse
  import pickle
  import time
  import dgl
  import dgl.function
  import numpy
  import torch
  import torch.nn
  import torch.nn.functional
  from torch.utils.data import DataLoader, IterableDataset
  from ..None import utils
label_desc: Use image node_id 2 for calling the ItemToItemBatchSampler obj's underlying member method code with example usage: obj.__iter__() without return types