text: # Copyright (c) Facebook, Inc. and its affiliates.
  import collections
  import warnings
  from collections import OrderedDict
  
  from pythia.common.registry import registry
  
  
  class Report(OrderedDict):
      def __init__(self, batch, model_output={}, *args):
          super().__init__(self)
          if self._check_and_load_tuple(batch):
              return
  
          all_args = [batch, model_output] + [*args]
          for idx, arg in enumerate(all_args):
              if not isinstance(arg, collections.abc.Mapping):
                  raise TypeError(
                      "Argument {:d}, {} must be of instance of "
                      "collections.abc.Mapping".format(idx, arg)
                  )
  
          self.writer = registry.get("writer")
  
          self.warning_string = (
              "Updating forward report with key {}"
              "{}, but it already exists in {}. "
              "Please consider using a different key, "
              "as this can cause issues during loss and "
              "metric calculations."
          )
  
          for idx, arg in enumerate(all_args):
              for key, item in arg.items():
                  if key in self and idx >= 2:
                      log = self.warning_string.format(
                          key, "", "in previous arguments to report"
                      )
                      warnings.warn(log)
                  self[key] = item
  
      def _check_and_load_tuple(self, batch):
          if isinstance(batch, collections.abc.Mapping):
              return False
  
          if isinstance(batch[0], (tuple, list)) and isinstance(batch[0][0], str):
              for kv_pair in batch:
                  self[kv_pair[0]] = kv_pair[1]
              return True
          else:
              return False
  
      def __setattr__(self, key, value):
          self[key] = value
  
      def __getattr__(self, key):
          try:
              return self[key]
          except KeyError:
              raise AttributeError(key)
  
      def fields(self):
          return list(self.keys())
  