code: def lengths_to_encoder_padding_mask(lengths, batch_first=False):
      """
      convert lengths (a 1-D Long/Int tensor) to 2-D binary tensor
  
      Args:
          lengths: a (B, )-shaped tensor
  
      Return:
          max_length: maximum length of B sequences
          encoder_padding_mask: a (max_length, B) binary mask, where
          [t, b] = 0 for t < lengths[b] and 1 otherwise
  
      TODO:
          kernelize this function if benchmarking shows this function is slow
      """
      max_lengths = torch.max(lengths).item()
      bsz = lengths.size(0)
      encoder_padding_mask = torch.arange(
          max_lengths
      ).to(  # a (T, ) tensor with [0, ..., T-1]
          lengths.device
      ).view(  # move to the right device
          1, max_lengths
      ).expand(  # reshape to (1, T)-shaped tensor
          bsz, -1
      ) >= lengths.view(  # expand to (B, T)-shaped tensor
          bsz, 1
      ).expand(
          -1, max_lengths
      )
      if not batch_first:
          return encoder_padding_mask.t(), max_lengths
      else:
          return encoder_padding_mask, max_lengths
  
imports: import torch
label_desc: Use image node_id 3 for calling a global function with example usage: lengths_to_encoder_padding_mask(lengths, batch_first) and returns: encoder_padding_mask,  max_lengths, encoder_padding_mask,  max_lengths