old_contents: # Copyright (c) 2017-present, Facebook, Inc.
  # All rights reserved.
  #
  # This source code is licensed under the license found in the LICENSE file in
  # the root directory of this source tree. An additional grant of patent rights
  # can be found in the PATENTS file in the same directory.
  
  import torch.nn as nn
  
  from fairseq import utils
  
  
  class LearnedPositionalEmbedding(nn.Embedding):
      """This module learns positional embeddings up to a fixed maximum size.
  
      Padding symbols are ignored, but it is necessary to specify whether padding
      is added on the left side (left_pad=True) or right side (left_pad=False).
      """
  
      def __init__(self, num_embeddings, embedding_dim, padding_idx, left_pad):
          super().__init__(num_embeddings, embedding_dim, padding_idx)
          self.left_pad = left_pad
  
      def forward(self, input, incremental_state=None):
          """Input is expected to be of size [bsz x seqlen]."""
          if incremental_state is not None:
              # positions is the same for every token when decoding a single step
              positions = input.data.new(1, 1).fill_(self.padding_idx + input.size(1))
          else:
              positions = utils.make_positions(input.data, self.padding_idx, self.left_pad)
          return super().forward(positions)
  
      def max_positions(self):
          """Maximum number of supported positions."""
          return self.num_embeddings - self.padding_idx - 1
  
new_contents: # Copyright (c) 2017-present, Facebook, Inc.
  # All rights reserved.
  #
  # This source code is licensed under the license found in the LICENSE file in
  # the root directory of this source tree. An additional grant of patent rights
  # can be found in the PATENTS file in the same directory.
  
  import torch.nn as nn
  
  from fairseq import utils
  
  
  class LearnedPositionalEmbedding(nn.Embedding):
      """This module learns positional embeddings up to a fixed maximum size.
  
      Padding symbols are ignored, but it is necessary to specify whether padding
      is added on the left side (left_pad=True) or right side (left_pad=False).
      """
  
      def __init__(self, num_embeddings, embedding_dim, padding_idx, left_pad):
          super().__init__(num_embeddings, embedding_dim, padding_idx)
          self.left_pad = left_pad
          self.onnx_trace = False
  
      def forward(self, input, incremental_state=None):
          """Input is expected to be of size [bsz x seqlen]."""
          if incremental_state is not None:
              # positions is the same for every token when decoding a single step
              positions = input.data.new(1, 1).fill_(self.padding_idx + input.size(1))
          else:
              positions = utils.make_positions(input.data, self.padding_idx, self.left_pad, self.onnx_trace)
          return super().forward(positions)
  
      def max_positions(self):
          """Maximum number of supported positions."""
          return self.num_embeddings - self.padding_idx - 1
  
subject: Add onnx_trace argument for learned embeddings (#492)