class_docstr: base class for classfication 
docstr: eval metrics 
docstr_tok: ["eval","metrics"]
code: def log_eval_metrics(self, metrics, save=False):
      """eval metrics"""
      logging.info("Eval Result:")
      if save:
          fobj = open(self.eval_metrics_path, "w")
      for key, value in metrics.items():
          logging.info("{}: {}".format(key, value))
          if save:
              fobj.write("{}: {}\n".format(key, value))
      if (
          "tp" in metrics
          and "fp" in metrics
          and "fn" in metrics
          and "tn" in metrics
      ):
          f1_score = metrics_lib.f1_score(
              metrics["tp"], metrics["fp"], metrics["fn"], metrics["tn"]
          )
          logging.info("F1: {}".format(f1_score))
          if save:
              fobj.write("F1: {}\n".format(f1_score))
  
imports: import os
  import re
  import functools
  import collections
  from absl import logging
  import delta.compat
  from tensorflow.python import debug
  from tensorflow.python.estimator.canned import metric_keys
  from tensorboard.plugins.pr_curve import summary
  from delta import utils
  from delta.utils.hparam import HParams
  from delta.utils import metrics
  from delta.utils import summary
  from delta.utils.register import registers
  from delta.utils.solver.base_solver import ABCEstimatorSolver
label_desc: Use image node_id 14 for calling the EstimatorSolver obj's underlying member method code with example usage: obj.log_eval_metrics(metrics, save) without return types