code: def get_metrics(self, reset: bool = False) -> Dict[str, float]:
          
          return {
                  'dpd_acc': self._action_sequence_accuracy.get_metric(reset),
                  'denotation_acc': self._denotation_accuracy.get_metric(reset),
                  'lf_percent': self._has_logical_form.get_metric(reset),
                  }
docs: We track three metrics here:
  
              1. dpd_acc, which is the percentage of the time that our best output action sequence is
              in the set of action sequences provided by DPD.  This is an easy-to-compute lower bound
              on denotation accuracy for the set of examples where we actually have DPD output.  We
              only score dpd_acc on that subset.
  
              2. denotation_acc, which is the percentage of examples where we get the correct
              denotation.  This is the typical "accuracy" metric, and it is what you should usually
              report in an experimental result.  You need to be careful, though, that you're
              computing this on the full data, and not just the subset that has DPD output (make sure
              you pass "keep_if_no_dpd=True" to the dataset reader, which we do for validation data,
              but not training data).
  
              3. lf_percent, which is the percentage of time that decoding actually produces a
              finished logical form.  We might not produce a valid logical form if the decoder gets
              into a repetitive loop, or we're trying to produce a super long logical form and run
              out of time steps, or something.