text: # 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.
  
  from . import FairseqDecoder
  
  
  class FairseqIncrementalDecoder(FairseqDecoder):
      """Base class for incremental decoders."""
  
      def __init__(self, dictionary):
          super().__init__(dictionary)
  
      def forward(self, prev_output_tokens, encoder_out, incremental_state=None):
          raise NotImplementedError
  
      def reorder_incremental_state(self, incremental_state, new_order):
          """Reorder incremental state.
  
          This should be called when the order of the input has changed from the
          previous time step. A typical use case is beam search, where the input
          order changes between time steps based on the selection of beams.
          """
          def apply_reorder_incremental_state(module):
              if module != self and hasattr(module, 'reorder_incremental_state'):
                  module.reorder_incremental_state(incremental_state, new_order)
          self.apply(apply_reorder_incremental_state)
  
      def set_beam_size(self, beam_size):
          """Sets the beam size in the decoder and all children."""
          if getattr(self, '_beam_size', -1) != beam_size:
              def apply_set_beam_size(module):
                  if module != self and hasattr(module, 'set_beam_size'):
                      module.set_beam_size(beam_size)
              self.apply(apply_set_beam_size)
              self._beam_size = beam_size
  