text: import torch
  from torch_geometric.utils import negative_sampling
  
  
  def create_link_label(pos_edge_index, neg_edge_index):
      """
      Create labels for link prediction, based on positive and negative edges
  
      Args:
          pos_edge_index (torch.tensor): Positive edge index [2, num_edges]
          neg_edge_index (torch.tensor): Negative edge index [2, num_edges]
  
      Returns: Link label tensor, [num_positive_edges + num_negative_edges]
  
      """
      num_links = pos_edge_index.size(1) + neg_edge_index.size(1)
      link_labels = torch.zeros(num_links, dtype=torch.float,
                                device=pos_edge_index.device)
      link_labels[:pos_edge_index.size(1)] = 1.
      return link_labels
  
  
  def neg_sampling_transform(data):
      """
      Do negative sampling for link prediction tasks
  
      Args:
          data (torch_geometric.data): Input data object
  
      Returns: Transformed data object with negative edges + link pred labels
  
      """
      train_neg_edge_index = negative_sampling(
          edge_index=data.train_pos_edge_index, num_nodes=data.num_nodes,
          num_neg_samples=data.train_pos_edge_index.size(1))
      data.train_edge_index = torch.cat(
          [data.train_pos_edge_index, train_neg_edge_index], dim=-1)
      data.train_edge_label = create_link_label(data.train_pos_edge_index,
                                                train_neg_edge_index)
  
      return data
  