code: def sample_blocks(
      self, seeds, heads=None, tails=None, neg_tails=None
  ):
      blocks = []
      for sampler in self.samplers:
          frontier = sampler(seeds)
          if heads is not None:
              eids = frontier.edge_ids(
                  torch.cat([heads, heads]),
                  torch.cat([tails, neg_tails]),
                  return_uv=True,
              )[2]
              if len(eids) > 0:
                  old_frontier = frontier
                  frontier = dgl.remove_edges(old_frontier, eids)
                  # print(old_frontier)
                  # print(frontier)
                  # print(frontier.edata['weights'])
                  # frontier.edata['weights'] = old_frontier.edata['weights'][frontier.edata[dgl.EID]]
          block = compact_and_copy(frontier, seeds)
          seeds = block.srcdata[dgl.NID]
          blocks.insert(0, block)
      return blocks
  
imports: import dgl
  import numpy
  import torch
  from torch.utils.data import DataLoader, IterableDataset
  from torchtext.data.functional import numericalize_tokens_from_iterator
label_desc: Use image node_id 2 for calling the NeighborSampler obj's underlying member method code with example usage: obj.sample_blocks(seeds, heads, tails, neg_tails) and returns: blocks