class_docstr: Negative sampler that randomly chooses negative destination nodes
  for each source node according to a uniform distribution.
  
  For each edge ``(u, v)`` of type ``(srctype, etype, dsttype)``, DGL generates
  :attr:`k` pairs of negative edges ``(u, v')``, where ``v'`` is chosen
  uniformly from all the nodes of type ``dsttype``.  The resulting edges will
  also have type ``(srctype, etype, dsttype)``.
  
  Parameters
  ----------
  k : int
      The number of negative samples per edge.
  
  Examples
  --------
  >>> g = dgl.graph(([0, 1, 2], [1, 2, 3]))
  >>> neg_sampler = dgl.dataloading.negative_sampler.PerSourceUniform(2)
  >>> neg_sampler(g, torch.tensor([0, 1]))
  (tensor([0, 0, 1, 1]), tensor([1, 0, 2, 3]))
code: def _generate(self, g, eids, canonical_etype):
      _, _, vtype = canonical_etype
      shape = F.shape(eids)
      dtype = F.dtype(eids)
      ctx = F.context(eids)
      shape = (shape[0] * self.k,)
      src, _ = g.find_edges(eids, etype=canonical_etype)
      src = F.repeat(src, self.k, 0)
      dst = F.randint(shape, dtype, ctx, 0, g.num_nodes(vtype))
      return src, dst
  
file_path: dgl/python/dgl/dataloading/negative_sampler.py
imports: from collections.abc import Mapping
  from ..None import backend
label_desc: Use image node_id 2 for calling the PerSourceUniform obj's underlying member method code with example usage: obj._generate(g, eids, canonical_etype) and returns: src,  dst